Python的pycrypto库用于随机数生成与os.urandom

时间:2013-12-08 22:33:13

标签: python random pycrypto

我试图理解并弄清楚我是否应该使用os.urandom()Crypto.Random.new()来加密安全的伪随机数。

以下网站似乎建议使用os.urandom()

https://github.com/mozilla/PyHawk/pull/13

但我真的不明白为什么我在网上找到的其他网站并没有真正解释使用哪个网站。

如果有人知道哪一个对加密使用是安全的,我将不胜感激!

我特别担心的一件事是,我打算用它来生成随机数,但我担心有一天我生成一些随机数,第二天生成器的状态是相同的,它开始生成相同的“随机”数字。

3 个答案:

答案 0 :(得分:10)

我去os.urandom。在我检查过的所有(最近的)Python实现中,只需打开与/dev/urandom无缓冲连接或其他非Linux平台上的等效设备,它就能正确完成。

另一方面,PyCrypto的Crypto.Random是一个基于Fortuna的非常复杂的包装器。这种复杂的构造可能是为了减轻底层操作系统的一些缺陷。不幸的是:

  • 它仍然从/dev/urandom(在Linux上)获取熵,因此如果操作系统被破坏,PyCrypto的Crypto.Random也将被破坏(无法实现其目的)
  • 这个选择已经适得其反,因为很难处理分叉和不同进程重用相同熵的情况(见CVE-2013-1445)。
  • Fortuna代码根本不包含在单元测试中,而Fortuna算法本身并没有附带测试向量。仅这一点就会迫使你(信仰)大放异彩。

答案 1 :(得分:9)

在您提供的链接中,给出更喜欢urandom()的原因是它提取了更少的代码(操作系统实现了“大部分”,os.urandom()内置于Python)。

如果您要分发Python包,可以通过最小化外部依赖性来简化用户的生活。这就是您找到的链接的全部内容。

在质量方面,无论哪种方式都可以正常工作。我更喜欢urandom(),因为我理解它的作用;我从来没有挖过PyCrypto的胆量。但urandom()被批评用于某些环境。 Click this并向下滚动到开始的部分

  

Gutterman,Pinkas,& Reinman于2006年3月发表了详细介绍   Linux随机数生成器的加密分析......

答案 2 :(得分:4)

urandom 确实返回加密安全号码,但需要注意。如果它耗尽了熵(由鼠标移动产生的真实随机数据,Ivy Bridge +芯片上的CPU温度波动等),它将开始产生不太安全的伪随机数。这些是由强大的生成器生成的,但根据您的应用程序,它们可能不够随机。在Unix系统上,/dev/random将在等待更多熵时阻塞,而/dev/urandom将开始生成伪随机数。

我对PyCrypto不了解,但是在阅读源代码时,似乎Crypto/Random/OSRNG/posix.py只是从/dev/urandom读取 - 所以我不会太担心这个选择。