1、伪随机数:即是统计学伪随机性,每个值的概率出现相同。
伪随机是由可确定的函数(常用线性同余),通过一个种子(常用时钟),产生的伪随机数。这意味着:如果知道了种子,或者已经产生的随机数,都可能获得接下来随机数序列的信息(可预测性)。
2、密码学安全伪随机性:给定随机样本的一本分和随机算法推算不出剩余部分。
3、真随机性:在具备上两条的基础上,还要具备不可重现性,不能通过给定相同的数据计算出相同序列。
由于计算机算法均具备确定的特性,所以真随机数无法由算法来生成
一般都是物理生成如:某一时间点的衰变速度、某一地区的本底辐射值、正确使用设计良好的骰子所获得的输出等
php中mt_rand()为伪随机数
第一次调用mt_rand()会自动播种,而后不会再播种,知道该进程结束,才会重新播种
这样该进程生成的随机数就都会使用相同的种子,这样就可以根据随机数破解出种子,而后计算出后面的随机数
破解原理:穷举所有的种子并根据种子生成随机数序列再跟已知的随机数序列做比对来验证种子是否正确
参考:
https://xz.aliyun.com/t/31/
php_mt_seed 破解工具 https://www.openwall.com/php_mt_seed/README
linux 下
/dev/random Linux
内核中的是第一个以背景噪声产生真正的随机数产生的实现,它允许程序访问来自设备驱动程序或其它来源的背景噪声。
发生器有一个容纳噪声数据的熵池,在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止[3]。这样的设计使得/dev/random是真正的随机数发生器,提供了最大可能的随机数据熵,建议在需要生成高强度的密钥时使用。
/dev/random的一个副本是/dev/urandom(“unblocked”,非阻塞的随机数发生器[4]),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。
随机数配置:/proc/sys/kernel/random