我使用 java SecureRandom 创建盐来加密用户。但是,当我尝试将用户与盐和密码匹配时,它们在不同的计算机上失败了。该用户是在 Linux 测试机器上创建的,我将数据库复制到我的 OS X 机器上。在测试机上匹配成功,但在我的 OS X 上失败。
使用以下代码,相同的盐得到不同的字节,甚至长度也不同:
salt.getBytes()
这是盐的生成过程:
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[20];
random.nextBytes(bytes);
String salt = new String(bytes);
user.setSalt(salt);
有可能 getBytes()
相同的盐在不同的机器上可能有不同的值?
最佳答案
不要这样做:String salt = new String(bytes);
您正在使用机器的默认编码将一系列字节转换为字符串。您应该将字节数组保留为字节数组。
如果将数据存储在数据库中,则可以将其存储在二进制字符串列中(例如 postgresql 中的 bytea - 在其他数据库中可能是 blob)。
关于java - Java SecureRandom 创建的 salt 具有不同的 getBytes() 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30887009/