Java SecureRandom.ints()安全吗?
众所周知,SecureRandom类为生成的随机数提供了强大的加密安全性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
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)
中所述,需要数字或数字流的其他方法最终都应该调用此特定方法。现在,如果情况确实如此,则取决于工具