我手上有一个难题。我创建了一个 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 上,每个输出都是正确的,而在 RHEL 7 上,这是错误的。
关于可能导致 RHEL 7 忽略种子的任何想法的建议?