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 有不同的值?
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)。
我使用 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 有不同的值?
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)。