Java SecureRandom.ints()安全吗?

Java SecureRandom.ints()安全吗?,java,security,random,Java,Security,Random,众所周知,SecureRandom类为生成的随机数提供了强大的加密安全性java.util.Random对于需要加密安全的情况是不安全的。SecureRandom的典型用法是: SecureRandom random = new SecureRandom(); byte bytes[] = new byte[20]; random.nextBytes(bytes); 然而,我遇到了一个案例: SecureRandom random = new SecureRandom(); int numbe

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

SecureRandom random = new SecureRandom();
byte bytes[] = new byte[20];
random.nextBytes(bytes);
然而,我遇到了一个案例:

SecureRandom random = new SecureRandom();
int number = random.ints();
方法
ints()
继承自
java.util.Random
类。当安全随机数生成器
SecureRandom
使用从不安全随机数生成器继承的方法时,我感到困惑,它是否安全?

提供加密强随机数生成器(RNG)

安全RNG的一个重要因素是种子

因此,传递给SecureRandom对象的任何种子材料都必须是不可预测的,并且所有SecureRandom输出序列必须是加密强的,如RFC 4086:安全性的随机性要求中所述

去用它吧。如果您对细节感兴趣,请阅读JavaDoc,它描述了实现所使用的各种方法。

Random.ints()
是一种返回
IntStream
的方法。
IntStream
既不安全也不不不安全:它是一个数字流

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

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


考虑一个类似于HashSet的例子:;然而,
HashSet
的子类确实保证迭代器排序。
LinkedHashSet
的保证与
HashSet
的保证是一致的,因为特定的顺序是可以通过“无保证顺序”观察到的可能顺序之一(毕竟,您必须以某种顺序返回元素)

类似地,
Random
不保证返回的整数序列的安全性
SecureRandom
提供了更有力的保障。但是没有理由不让
SecureRandom
中的int序列同时被
Random
返回,这是巧合。

是的,它是安全的

java.util.Random的代码检查显示ints()创建一个拆分器,该拆分器使用internalNextInt(…)生成随机整数。依次调用
this
上的
nextInt()。在
java.security.SecureRandom
的情况下,
nextInt()
被重写以生成一个“安全”随机数1

您可以通过查看源代码来确认这一点


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

ints方法 是的,它是安全的,只要
nextInt()
是安全的(对于从流中检索到的整数数量)

根据报告:

生成一个伪随机
int
值,就好像它是调用方法
nextInt()
的结果一样

现在依次:

方法
nextInt
通过类
Random
实现,就像通过(返回)
next(32)

next(int)
是一个受保护的方法,您不能调用它,但可以在实现类中重写它

如果使用的是
SecureRandom
而不是
Random
的实例,则反过来实现为

生成包含用户指定数量的伪随机位(右对齐,前导零)的整数。此方法重写
java.util.Random
方法,并为从该类继承的所有方法提供随机位源(例如,
nextInt
nextLong
nextFloat

因此,最终调用了
SecureRandom
方法,如果该方法是安全的,那么随机数流是安全的。老实说,该语句在某种意义上是错误的,因为它不用于
nextBytes
,但它肯定用于任何返回数值的方法

安全随机实现 如果您已经确定您使用的
SecureRandom
是安全的,那么您可以停止阅读此处

现在您可能会认为它将在这里结束,但是
SecureRandom
本身并不实现一个随机生成器。相反,它只取决于配置的提供程序中实现
SecureRandomSpi
的特定服务类(Spi表示服务提供程序接口,抽象类a提供程序必须实现以向
SecureRandom
的实例提供安全的随机数据)。因此,最终必须在
SecureRandom#next(int)
中调用以检索实际位


正如《随机下一步》(int)
中所述,需要数字或数字流的其他方法最终都应该调用此特定方法。现在,如果情况确实如此,则取决于工具