一尘不染

将密钥转换为字符串,反之亦然

java

我正在生成密钥,需要将其存储在数据库中,因此我将其转换为字符串,但是要从字符串中获取密钥。有哪些可能的方法可以做到这一点?

我的代码是

SecretKey key = KeyGenerator.getInstance("AES").generateKey();
String stringKey=key.toString();
System.out.println(stringKey);

如何从字符串取回密钥?


阅读 1141

收藏
2020-09-08

共1个答案

一尘不染

您可以将转换SecretKey为字节数组(byte[]),然后Base64将其编码为String。要转换回a
SecretKey,Base64 会对String进行解码,并在a中使用它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());

字符串到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):

注意I:
您可以跳过Base64编码/解码部分,而只将其存储byte[]在SQLite中。也就是说,执行Base64编码/解码并不是一项昂贵的操作,并且您可以将字符串存储在几乎任何数据库中而不会出现问题。

注意II: 较早的Java版本在java.langjava.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)}

字符串到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");
2020-09-08