0
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
byte[] salt = new byte[16];
random.nextBytes(salt);

我想将盐转换为要存储/读取的字符串。我似乎无法让它发挥作用。我读过我需要使用正确的编码,但我不确定要使用什么编码。我已经尝试了以下但得到垃圾:

String s = new String(salt, "UTF-8");
String s = new String(salt, "UTF-16");
String s = new String(salt);

编辑:对于上下文,我正在尝试通过并理解代码。我正在尝试查看盐和密码,以便我可以使用代码。

4

2 回答 2

7

您需要使用Base64 (Apache Commons) 类或sun.misc.BASE64Encoder/BASE64Decode对字节数组进行编码。

于 2012-07-07T02:16:28.310 回答
3

就像 AVD 所说,解决方案是使用 Base64 编码或其他一些二进制文本编码。(例如,十六进制编码。)

为什么?因为二进制数据不是文本!

您当前所做的是告诉 String 构造函数字节是已正确编码为 UTF-8 或 UTF-16 或(在最后一种情况下)平台的默认编码的文本。这显然是错误的。如果您尝试将随机二进制内容解码为文本,您将看到的“垃圾”。

更糟糕的是,当您将解码过程应用于随机二进制数据时,它可能是有损的。例如,如果您尝试将某些字节序列视为 UTF-8,则它们根本无效。'?'(UTF-8 的规范是这么说的!)当 UTF-8 解码器看到这些无效序列之一时,它会将其替换为表示“无效字符”的字符(例如 a )。如果您随后将字符串中的字符转换回字节,您将获得与开始时不同的字节序列。这对您的用例来说可能是一场灾难。

于 2012-07-07T03:53:30.940 回答