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

salt created by Java SecureRandom has different getBytes() value

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

同样的salt得到不同的字节,下面的代码连长度都不一样:

salt.getBytes()

这是生成盐的过程:

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

getBytes() 是否可能在不同的机器上对相同的 salt 有不同的值?

根据String.getBytes()

getBytes() Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array.

因此,如果您在机器上使用不同的字符集,结果将会不同。

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

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

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