我正在阅读有关标准库中python的随机模块的信息。当我设置种子并产生一些随机数时,我感到很惊讶:

random.seed(1)
for i in range(5):
    print random.random()

产生的数字与文章中的样本完全相同。我认为可以肯定地说种子设定好算法是确定性的。

并且当未设置种子时,标准库使用time.time()进行种子。
现在假设在线服务使用random.random()生成验证码,黑客是否可以使用同一随机生成器轻松地复制验证码?
  • 让我们假设黑客知道将随机数转换为验证码的算法。否则,这似乎是不可能的。
  • 因为导入模块时会调用random.seed(),所以我假设对于Web应用程序而言,用作种子的时间大约是发送请求的时间(几秒钟之内),因此很难尝试几次?

  • 我是否担心太多,还是这是一个真正的漏洞?

    最佳答案

    播种后序列是确定性的,这并不奇怪。这就是播种的重点。 random.random被称为PRNG,即随机数生成器。这不是Python独有的,每种语言的简单随机源都是以这种方式确定的。

    是的,真正关心安全性的人们会担心攻击者可能会重演该序列。这就是为什么可以使用其他随机性源的原因,例如os.urandom,但是它们更昂贵。

    但是问题并不像您所说的那么糟糕:对于一个Web请求,通常一个进程处理多个请求,因此该模块在过去某个未知的时刻初始化,而不是在收到Web请求时初始化。

    09-30 15:30
    查看更多