在类似的问题中,"Conversion of byte[] into a String and then back to a byte[]"被认为不做byte[]到字符串和反向转换,看起来像什么适用于大多数情况,主要是当你不知道使用的编码时。
但是,在我的例子中,我试图将javax.crypto.SecretKey数据保存到数据库中,然后恢复它。
该接口提供了一个方法getEncoded(),它返回编码为byte[]的密钥数据,对于另一个类,我可以使用这个byte[]来恢复密钥。
因此,问题是,我如何将密钥字节写为字符串,然后获取byte[]以重新生成密钥?
发布于 2010-05-27 01:22:53
javax.crypto.SecretKey是二进制数据,所以您不能将其直接转换为字符串。您可以将其编码为十六进制字符串或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);
}它相当难看,不标准,也不是最优的(在输出大小上)。但它也非常小,正确,并且没有依赖关系;它可以是实用的,特别是当你的数据很小的时候。
更新:在GregS的评论之后,我用文字值(36)替换了Character.MAX_RADIX。它可能看起来不那么优雅,但实际上更安全。(您也可以使用32或16)。
https://stackoverflow.com/questions/2915224
复制相似问题