我手头有一个难题。我创建了一个 AES 服务来加密/解密敏感信息。 AES 密钥是使用 java 随机生成的SecureRandom
。我有一个受保护的文件,用于存储种子,并且在调用服务时,种子将填充到安全随机类中。
为了确保它有效,我有以下逻辑:
private boolean secureRandom(final String seed) {
SecureRandom sr1 = new SecureRandom(seed.getBytes(UTF8_CHARSET));
SecureRandom sr2 = new SecureRandom(seed.getBytes(UTF8_CHARSET));
//Two secure random with the same seed should generate the same results
boolean secureRandomWorks = sr1.nextLong() == sr2.nextLong();
if (!secureRandomWorks) {
System.err.println("Secure random not supported. Defaulting to old key");
}
return secureRandomWorks;
}
这里的想法是我应该能够使用相同的种子创建两个安全的随机对象,并且它们在调用时都应该返回相同的值nextLong()
当我在 Windows 计算机上部署应用程序时,这工作正常,但当我将其部署在 RHEL 7 计算机上时,我收到错误。
我的印象是,只要种子相同,两个实例总是会产生相同的输出。在 Windows 上似乎是这种情况,但当我在 RHEL 7 上测试时,情况似乎并非如此。
我创建了这个简单的测试来进行验证:
SecureRandom sr1 = new SecureRandom("encryptionKey".getBytes("UTF-8"));
SecureRandom sr2 = new SecureRandom("encryptionKey".getBytes("UTF-8"));
for (int i = 0; i < 1000; i++) {
System.out.println(sr1.nextLong() == sr2.nextLong());
}
在 Windows 上,每个输出都是 true,而在 RHEL 7 上,这是 false。
关于可能导致 RHEL 7 忽略种子的任何建议?
我没有找到任何文档禁止您在 RHEL 7 上观察到的行为。
JavaDoc 用于java.util.Random明确指出
如果使用相同的种子创建两个 Random 实例,并且对每个实例进行相同的方法调用序列,则它们将生成并返回相同的数字序列
JavaDoc 用于java.security.SecureRandom不包含类似的声明。
相反,它提到(在文档中setSeed()
method)
重新播种该随机对象。给定的种子补充而不是替代现有的种子。因此,重复调用保证永远不会降低随机性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)