javax.crypto.SecretKey
是二进制数据,所以你不能直接将它转换为字符串。您可以将其编码为十六进制字符串或Base64。
请参阅Apache Commons Codec。
更新:如果您不想依赖第三方库(并且不能/不希望存储纯二进制数据,正如Jon所建议的那样),您可以执行一些特殊编码,例如,按照埃里克森的建议:
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)。
一个很好的解决方案,它甚至占据了领先的零。如果我可能挑剔,我会选择自己的常量,大概32或16,而不是Character.MAX_RADIX。未来版本的java.lang.Character可能会使用比36更大的值。 – 2010-05-26 23:28:18
@GregS:你说得对。顺便说一句,Character.MAX_RADIX目前是363 – leonbloy 2010-05-27 00:55:31
虽然答案是正确的,我想知道:你的意思是“SecretKey是二进制数据”吗?对我而言,在某种程度上,一切都是二进制数据。你能给出一个不是二进制数据的例子吗?谢谢! – 2010-06-02 18:52:30