SecureRandom.ints() 是安全的吗?

2022-08-31 16:28:00

众所周知,SecureRandom 类为生成的随机数提供强大的加密安全性。 对于需要加密安全性的情况是不安全的。典型用法是:java.util.RandomSecureRandom

SecureRandom random = new SecureRandom();
byte bytes[] = new byte[20];
random.nextBytes(bytes);

但是,我遇到了一个案例:

SecureRandom random = new SecureRandom();
int number = random.ints();

该方法继承自该类。当哪个是安全的随机数生成器使用从不安全的随机数生成器继承的方法时,我感到困惑,它是否安全?ints()java.util.RandomSecureRandom


答案 1

是的,它是安全的。

对创建用于生成随机整数的拆分器的 show 进行代码检查。这反过来又需要.在 的情况下,被覆盖以生成一个“安全”的随机数1java.util.Randomints()internalNextInt(...)nextInt()thisjava.security.SecureRandomnextInt()

您可以通过查看源代码自行确认这一点。


1 - 当然,将整数或整数序列称为“安全”实际上没有意义。在某些情况下,SecureRandom 可能没有您需要的属性。(这取决于类使用的实际RNG或PRNG实现,提供的种子或系统提供的熵源的质量等。但是 SecureRandom::ints() 将生成一个整数序列,该序列具有相同的属性,就像在同一对象上调用 SecureRandom::nextInt() 一样。如果后一个序列适合您的目的(无论它们是什么),那么前者也是如此。


答案 2

Random.ints()是返回 .An既不安全也不不安全:它是一个数字流。IntStreamIntStream

方法返回的 int 序列的“安全性”取决于方法的实现。 生成其“随机”值比 更安全。它们共享相同的 API,因此您可以根据自己的要求在给定上下文中使用其中任何一个。SecureRandomRandom

因此,它从不安全的类继承的事实与安全性无关:您可以合理地相信该类与文档所说的一样安全。SecureRandom


考虑一个类比:这不能保证迭代器排序;但是,LinkedHashSet,一个子类确实保证了迭代器排序。的保证与 的保证一致,因为特定的排序是可以用“无保证排序”观察到的可能排序之一(毕竟,您必须以某种顺序返回元素)。HashSetHashSetLinkedHashSetHashSet

同样,不保证返回的整数序列的安全性; 提供更强的保证。但是没有理由为什么 来自 a 的整数序列不能由 一个 巧合返回。RandomSecureRandomSecureRandomRandom