AES密钥编码byte []到String并返回byte []

Tom*_*ito 4 java encryption

在类似的问题"将byte []转换为String然后再转换为byte []",据说不执行byte []到String和返回转换,这看起来像适用于大多数情况,主要是当你不穿不知道使用的编码.

但是,在我的情况下,我正在尝试将数据保存到数据库javax.crypto.SecretKey,然后将其恢复.

该接口提供了一个方法getEncoded(),它返回编码为byte []的密钥数据,而另一个类我可以使用此byte []来恢复密钥.

所以,问题是,如何将关键字节写为String,然后返回byte []以重新生成密钥?

leo*_*loy 6

javax.crypto.SecretKey是二进制数据,因此您无法将其直接转换为String.您可以将其编码为十六进制字符串或Base64.

请参阅Apache Commons Codec.

更新:如果您不想依赖第三方库(并且不能/不想存储纯二进制数据,如Jon建议的那样),您可以执行一些特殊编码,例如,遵循erickson的建议:

public static String bytesToString(byte[] b) {
    byte[] b2 = new byte[b.length + 1];
    b2[0] = 1;
    System.arraycopy(b, 0, b2, 1, b.length);
    return new BigInteger(b2).toString(36);
}

public static byte[] stringToBytes(String s) {
    byte[] b2 = new BigInteger(s, 36).toByteArray();
    return Arrays.copyOfRange(b2, 1, b2.length);
}
Run Code Online (Sandbox Code Playgroud)

它相当,丑陋,非标准且不是最佳的(输出尺寸).但它也非常小,正确且没有依赖性; 它可以是实用的,特别是如果您的数据很小.

更新:我Character.MAX_RADIX按照GregS的评论替换了字面值(36).它可能看起来不那么优雅,但它实际上更安全.(您也可以使用32或16).