生成一个密钥,需要将其存储在DB中,所以我将其转换为一个字符串,但从字符串中获取密钥。有什么可能的方法来实现呢?
我的代码是
SecretKey key = KeyGenerator.getInstance("AES").generateKey();
String stringKey=key.toString();
System.out.println(stringKey);
如何从String中获取密钥?
你可以将SecretKey转换为字节数组(byte []),然后Base64将其编码为字符串。要转换回SecretKey,Base64解码字符串并使用它在SecretKeySpec重建您的原始SecretKey。
对于Java 8
SecretKey到字符串:
// create new key
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
// get base64 encoded version of the key
String encodedKey = Base64.getEncoder().encodeToString(secretKey.getEncoded());
String到SecretKey:
// decode the base64 encoded string
byte[] decodedKey = Base64.getDecoder().decode(encodedKey);
// rebuild key using SecretKeySpec
SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
对于Java 7及更高版本(包括Android):
注意:你可以跳过Base64编码/解码部分,只是将字节[]存储在SQLite中。也就是说,执行Base64编码/解码不是一个昂贵的操作,你可以存储字符串在几乎任何DB没有问题。
注意:早期Java版本在java.lang或java.util包之一中不包含Base64。然而,可以使用Apache Commons Codec,Bouncy Castle或Guava的编解码器。
SecretKey到字符串:
// CREATE NEW KEY
// GET ENCODED VERSION OF KEY (THIS CAN BE STORED IN A DB)
SecretKey secretKey;
String stringKey;
try {secretKey = KeyGenerator.getInstance("AES").generateKey();}
catch (NoSuchAlgorithmException e) {/* LOG YOUR EXCEPTION */}
if (secretKey != null) {stringKey = Base64.encodeToString(secretKey.getEncoded(), Base64.DEFAULT)}
String到SecretKey:
// DECODE YOUR BASE64 STRING
// REBUILD KEY USING SecretKeySpec
byte[] encodedKey = Base64.decode(stringKey, Base64.DEFAULT);
SecretKey originalKey = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");