返回

生产环境中推荐使用SecureRandom.getInstanceStrong有什么坑?

闲谈

SecureRandom.getInstanceStrong() 是 Java 中用于生成安全随机数的类。它比 Random 类更安全,但也会更慢。在生产环境中,强烈建议使用 SecureRandom.getInstanceStrong() 来生成随机数。SecureRandom.getInstanceStrong() 的实现基于操作系统提供的随机数生成器,因此它可以生成更安全的随机数。但是,它也会更慢,因为它需要访问操作系统提供的随机数生成器,这可能会导致性能下降。

在生产环境中,强烈建议使用 SecureRandom.getInstanceStrong() 来生成随机数。但是,需要注意的是,SecureRandom.getInstanceStrong() 可能比 Random 更慢。因此,在使用 SecureRandom.getInstanceStrong() 之前,请务必考虑应用程序的性能需求。

需要重点说明的是,SecureRandom.getInstanceStrong() 在生产环境中推荐使用,但它也有一个坑需要注意。

SecureRandom.getInstanceStrong() 使用的是操作系统提供的随机数生成器,而不同的操作系统提供的随机数生成器可能存在差异。因此,在不同的操作系统上使用 SecureRandom.getInstanceStrong() 可能生成不同的随机数。这可能会导致应用程序在不同的操作系统上表现出不同的行为。

例如,在 Linux 系统上,SecureRandom.getInstanceStrong() 使用的是 /dev/urandom 设备作为随机数生成器。/dev/urandom 设备是一个伪随机数生成器,它使用系统熵来生成随机数。系统熵是指系统中不可预测的事件,例如键盘输入、鼠标移动等。但是,在 Windows 系统上,SecureRandom.getInstanceStrong() 使用的是 CryptGenRandom 函数作为随机数生成器。CryptGenRandom 函数是一个伪随机数生成器,它使用系统时钟和计数器来生成随机数。

因此,在 Linux 系统和 Windows 系统上使用 SecureRandom.getInstanceStrong() 可能生成不同的随机数。这可能会导致应用程序在不同的操作系统上表现出不同的行为。

为了避免这个问题,可以在应用程序中使用 SecureRandom.getInstanceStrong(seed) 方法来生成随机数。seed 参数是一个字节数组,它指定了随机数生成器的种子。如果在不同的操作系统上使用相同的种子,则 SecureRandom.getInstanceStrong(seed) 方法将生成相同的随机数。

例如,可以如下所示使用 SecureRandom.getInstanceStrong(seed) 方法来生成随机数:

SecureRandom random = SecureRandom.getInstanceStrong(new byte[] { 1, 2, 3, 4, 5 });
int randomNumber = random.nextInt();

这样,就可以确保在不同的操作系统上生成相同的随机数。