我正在阅读有关标准库中python的随机模块的信息。当我设置种子并产生一些随机数时,我感到很惊讶:
random.seed(1)
for i in range(5):
print random.random()
产生的数字与文章中的样本完全相同。我认为可以肯定地说种子设定好算法是确定性的。
并且当未设置种子时,标准库使用
time.time()
进行种子。现在假设在线服务使用
random.random()
生成验证码,黑客是否可以使用同一随机生成器轻松地复制验证码?我是否担心太多,还是这是一个真正的漏洞?
最佳答案
播种后序列是确定性的,这并不奇怪。这就是播种的重点。 random.random
被称为PRNG,即伪随机数生成器。这不是Python独有的,每种语言的简单随机源都是以这种方式确定的。
是的,真正关心安全性的人们会担心攻击者可能会重演该序列。这就是为什么可以使用其他随机性源的原因,例如os.urandom
,但是它们更昂贵。
但是问题并不像您所说的那么糟糕:对于一个Web请求,通常一个进程处理多个请求,因此该模块在过去某个未知的时刻初始化,而不是在收到Web请求时初始化。