关于随机数种子的问题和建议

关于随机数种子的问题和建议

作者:BlogUpdater |  时间:2021-02-07 |  浏览:125 |  评论已关闭 条评论

课前知识
在最基本的层次上,SSL通过使用密钥(只有发送者和接收者才知道的大而随机的数字)加密消息来保护通信。因为你不能安全地假设窃听者没有加密和解密算法的完整详细信息,所以只有知道了这些算法所有详细信息的人无法不尝试所有操作而无法恢复消息时,该协议才能被认为是安全的。最终,安全性取决于尝试所有可能的解密密钥值的不可行性。

与其他任何加密协议一样,SSL的安全性在很大程度上取决于此密钥的不可预测性。如果攻击者可以预测密钥的值,甚至可以缩小必须尝试使用​​的密钥的数量,则与使用真正随机密钥相比,可以以更少的努力来破坏协议。因此,至关重要的是,密钥是从不可预测的随机数源生成的。

随机性不是一种黑白性质:某些数字流比其他数字流更具随机性。唯一真正的随机数源是那些与物理现象有关的源,例如元素的放射性衰变速率或半导体二极管的热噪声。除非使用外部设备,否则需要随机数的计算机程序必须自己生成这些数字。但是,由于CPU是确定性的,因此无法通过算法生成真正的随机数。

许多常见的计算机应用程序(例如游戏)都使用任何容易获得的随机性源向伪随机数生成器(PRNG)提供称为“种子”的初始值。PRNG通过重复加扰种子来进行操作。通常,种子是一个短的随机数,PRNG会扩展为更长的,看起来随机的比特流。一个典型的游戏可能会在一天中的某个时间播种PRNG。参见下图。

对于简单的游戏,每次运行游戏时都只需要更改种子即可。尽管种子是可以预测的,但是在安全性并不是主要问题。但是,在密码学应用程序中,种子的不可预测性至关重要。如果攻击者可以缩小可能的种子的范围,则他的工作将变得更加容易。由于假定PRNG用来将种子转换为伪随机数序列的功能是已知的,因此较小的可能种子集会产生PRNG产生的相应的序列集。

一种为PRNG选择种子值的好方法是诸如SSL之类的密码系统的重要组成部分。如果可以轻易猜出PRNG的种子值,则该程序提供的安全级别将大大降低,因为攻击者解密解密的消息所需的工作较少。

正文开始
随机数生成实际上是一个比较困难的过程。这就是为什么需要把这项任务交给专家的原因。
但是,即使你选择了一个看起来很好的随机数生成器,你还需要注意使用正确的种子来初始化它。
有一篇论文提到:如果黑客可以猜到一个随机数生成器的初始化种子,那么它就不会是这个世界上最好的随机数生成器。
很多猿友会使用当前时间戳里作为随机数生成器的种子,但是,请注意:这个并不十分安全。
对于黑客来说,猜测当前时间并不困难。所以,当选择随机数种子的时候,最后尽量传入一些不那么容易被人猜到的数字。
就像论文中提到到:使用时间戳和进程ID都不是很好的选择。

那么,怎么办?
抱歉请不要问我,我并非这个领域的专家。
猿友们可以到网上找一些相关的论文,但要注意擦亮眼睛:有些可能是比较好的方案,有些可能没那么好。

总结
下次调用srand,请勿使用time(0)或者GetTickCount,想想别的招儿。
还是安全一点好。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The random number seed can be the weakest link》

评论已关闭。