为什么某些随机()函数被认为是"not secure?"



我听说人们被警告不要依赖语言的random()函数来生成随机数或字符串序列"出于安全原因"。Java甚至有一个SecureRandom类。为什么会这样?

当人们谈论预测随机数生成器的输出时,他们甚至不需要得到实际的"下一个数字"。即使是一些微妙的事情,比如注意到随机数不是均匀分布的,或者它们从来不会连续两次产生相同的数字,或者"第5位总是设置的",也可以大大有助于将基于猜测"随机"数的攻击从花费数年的时间转变为花费几天的时间。

通常也有一个权衡。如果没有特定的硬件,快速生成大量随机数可能会非常困难,因为计算机没有足够的"随机性",所以它必须假装它。

如果你不将随机性用于安全性(密码学,密码等),而是用于模拟或数值工作,那么它们是否可预测并不重要,只有它们在统计上是随机的。

几乎每个随机数生成器都是'伪随机',因为它使用随机数表或可预测公式。种子有时用于在特定点"启动"随机序列,例如seedrrandom (timer)。

这在BAsIC编程时代尤其普遍,因为它的随机数生成器总是从完全相同的数字序列开始,这使得它无法用于任何类型的GUID生成。

在那个时候,Z-80微处理器有一个真正的随机数生成器,尽管它只是一个介于0和127之间的数字。

可以提前确定的伪随机数可能导致容易受到随机数生成器攻击的安全漏洞。

随机数的可预测性是一个大问题。大多数"随机"函数的值来源于时间。给定一组正确的条件,你最终可以得到两个相同的大数值的"随机"数。

在windows。net世界中,CPRNG(加密安全伪随机数生成器)可以通过底层win32 api在system . security . cryptographic . randomnumbergenerator中找到在Linux中有一个随机的"设备"

最新更新