SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
byte[] salt = new byte[16];
random.nextBytes(salt);
我想将salt转换为字符串来存储/读取。我似乎无法让这个工作。我已经读过我需要使用正确的编码,但我不确定要使用哪种编码。我尝试了以下但是得到了垃圾:
String s = new String(salt, "UTF-8");
String s = new String(salt, "UTF-16");
String s = new String(salt);
编辑:对于上下文,我正在努力完成并理解this代码。我正在尝试查看salt和密码,以便我可以使用代码。
答案 0 :(得分:7)
您需要使用Base64(Apache Commons)类或sun.misc.BASE64Encoder/BASE64Decode
来编码字节数组。
答案 1 :(得分:3)
与AVD一样,解决方案是使用Base64编码或其他二进制文本编码。 (例如,十六进制编码。)
为什么呢?因为二进制数据不是文本!
您目前正在做的是告诉String构造函数,字节是已正确编码为UTF-8或UTF-16的文本,或者(在最后一种情况下)平台的默认编码。这显然是错误的。如果您尝试将随机二进制内容解码为文本,那么您所看到的“垃圾”就是您所获得的。
更糟糕的是,当您将其应用于随机二进制数据时,解码过程可能有损。例如,如果您尝试将它们视为UTF-8,则某些字节序列将无效。 (UTF-8的规范是这样说的!)当UTF-8解码器看到其中一个无效序列时,它会用一个字符(例如'?'
)替换它,这意味着“无效字符”。如果然后将字符串中的字符转回字节,则会得到与您开始的字节序列不同的字节序列。这对你的用例来说可能是一场灾难。