出于安全原因,我听到人们被警告不要依赖语言的random()
函数来生成随机数或字符串序列。 Java甚至有一个SecureRandom
类。为什么是这样?
答案 0 :(得分:3)
当人们谈论预测随机数发生器的输出时,他们甚至不需要获得实际的“下一个数字”。即使是一些微妙的事情,比如注意到随机数不均匀分布,或者它们从未连续两次产生相同的数字,或者“第5位总是被设置”,也可以在很大程度上根据猜测来转变攻击从一年到几天的“随机”数字。
通常也有一种权衡。如果没有特定的硬件,快速生成大量随机数可能会非常困难,因为计算机没有足够的“随机性”,所以它必须伪造它。
如果你没有使用随机性来保证安全性(加密,密码等),而是用于模拟或数字工作之类的东西,那么如果它们是可预测的那么它们并不重要,只是它们是统计上是随机的。
答案 1 :(得分:1)
几乎每个随机数生成器都是'伪随机',因为它使用随机数表或可预测的公式。种子有时用于在特定点“开始”随机序列,例如, seedRandom(定时器)。
这在BAsIC编程时代尤为普遍,因为它的随机数生成器始终以完全相同的数字序列开始,因此无法用于任何类型的GUID生成。
当天早些时候,Z-80微处理器有一个真正的随机数生成器,虽然它只是0到127之间的数字。它使用了处理器循环功能,并且无法预测。
答案 2 :(得分:0)
可以提前确定的伪随机数可能会导致易受random number generator attack攻击的安全漏洞。
答案 3 :(得分:0)
随机数的可预测性是一个大问题。大多数“随机”函数从时间推导出它们的价值。给定正确的条件,您可能会得到两个相同的大值的“随机”数字。
在Windows .NET中,可以通过基础win32 API在System.Security.Cryptography.RandomNumberGenerator中找到CPRNG(加密安全伪随机数生成器) 在Linux中有一个随机的“设备”