RHE 7 不尊重 java 安全随机种子



我手上有一个窘境。我创建了一个 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忽略种子的原因的任何想法的建议?

我没有找到任何禁止您在 RHEL 7 上观察到的行为的文档。

JavaDoc forjava.util.Random明确声明

如果使用相同的种子创建了两个 Random 实例,并且对每个实例进行了相同的方法调用序列,则它们将生成并返回相同的数字序列

JavaDoc forjava.security.SecureRandom不包含类似的语句。

相反,它提到(在setSeed()方法的文档中(

重新设定此随机对象的种子。给定的种子补充而不是取代现有的种子。因此,保证重复调用永远不会降低随机性。

事实证明,RHEL 7(以及一般的Linux机器(默认使用与Windows不同的算法。Linux 使用NativePRNG,而 Windows 使用SHA1PRNG

Linux利用内置的/dev/random/dev/urandom使用NativePRNG

考虑到这一点,我能够更改初始化 SecureRandom 对象的方式

private static final String ALGORITHM = "SHA1PRNG";
private static final String PROVIDER = "SUN";
private SecureRandom getSecureRandom(String seed) throws NoSuchAlgorithmException, NoSuchProviderException {
SecureRandom sr = SecureRandom.getInstance(ALGORITHM, PROVIDER);
sr.setSeed(seed.getBytes(UTF8_CHARSET));
return sr;
}

从文档中getInstance不会播种对象,因此它可以根据需要进行。

返回的 SecureRandom 对象尚未设定种子。要播种 返回的对象,调用 setSeed 方法。如果未调用 setSeed, 对nextBytes的第一次调用将强制SecureRandom对象播种 本身。如果以前是 setSeed,则不会发生此自种子设定 叫。

现在它被迫使用我需要的东西,我不应该对 RHEL 7 有问题。

最新更新