我正在使用java.security.SecureRandomangorithm"SHA1PRNG"来生成加密密钥。这是用于加密次要数据的历史代码。然而,当我们从java8切换到java11时,我们的代码停止工作。这是重现这种情况的测试用例:
@Test
void srEncryptionSeedTest() throws NoSuchAlgorithmException
{
final long versionSalt = 1850498708034063014L;
final long customSalt = -919666267416765972L;
final SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(versionSalt);
final long l1 = sr.nextLong();
final long l2 = sr.nextLong();
sr.setSeed(customSalt);
final long k1 = sr.nextLong();
final long k2 = sr.nextLong();
// check l1 and l2
Assert.assertEquals(l1, 6338935000439666355L);
Assert.assertEquals(l2, -7355545655857008441L);
// Seeding
// check k1 and k2
Assert.assertEquals(k1, -2226559466996804670L); //
Assert.assertEquals(k2, -3123855249705841778L);
}
这在 java11 上工作正常,但在 java8 上我们有k1=-4273821888324981770and k2=3053251164341917236,所以测试失败。如您所见,在生成相同数量的相同随机数后设置完全相同的种子后测试开始失败,所以我怀疑 RNG 的状态不同,但调试对我没有帮助(我不明白为什么这不一样)。这可以很容易地在任何操作系统上重现。
关于 Java8 JVM 的一些事实:
java.vendor -> Oracle Corporation // same goes on OpenJDK builds
java.version -> 1.8.0_202-ea // same goes on 1.8.0_181
java.vm.info -> mixed mode
java.specification.version -> 1.8
java.runtime.name -> Java(TM) SE Runtime Environment
关于 Java11 JVM 的一些事实:
java.vendor -> AdoptOpenJDK
java.version -> 11.0.3
java.vm.info -> mixed mode
java.specification.version -> 11
java.runtime.name -> OpenJDK Runtime Environment
任何帮助将不胜感激。
哔哔one
相关分类