Java SecureRandom创建的salt具有不同的getBytes()值

时间:2015-06-17 09:05:00

标签: java security salt

我使用java SecureRandom创建salt来加密用户。但是,当我尝试将用户与salt和密码匹配时,他们在不同的计算机上失败了。用户是在Linux测试机器上创建的,我将数据库复制到我的OS X机器上。测试机器上的匹配成功,但我的OS X上失败了。

相同的盐使用以下代码获得不同的字节,即使长度不同:

salt.getBytes()

enter image description here

enter image description here

以下是盐生成过程:

        SecureRandom random = new SecureRandom();
        byte bytes[] = new byte[20];
        random.nextBytes(bytes);
        String salt = new String(bytes);
        user.setSalt(salt);

getBytes()可能在不同的机器上对同一个盐有不同的值吗?

2 个答案:

答案 0 :(得分:1)

根据String.getBytes()

  

getBytes()使用。将此String编码为字节序列   platform的默认字符集,将结果存储到新的字节数组中。

因此,如果您在机器上有不同的字符集,结果会有所不同。

答案 1 :(得分:1)

不要这样做:String salt = new String(bytes);

您正在使用计算机的默认编码将一系列字节转换为字符串。您应该将字节数组保持为字节数组。

如果将数据存储在数据库中,则可以将其存储在二进制字符串列中(例如,postgresql中的bytea - 可能是其他数据库中的blob)。