Python用于随机数生成的pycrypto库vsos.urandom公司

2024-10-01 17:32:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解并弄清楚我是应该使用os.urandom()还是{}来加密安全的伪随机数。在

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

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

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

如果有人知道哪一个是安全的加密使用,我将非常感谢你的建议!在

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


Tags: httpsgithubcommozillaos网站状态urandom
3条回答

urandom返回加密安全数字,但有一个警告。如果它耗尽了熵(鼠标移动产生的真实随机数据、常春藤桥+芯片上的CPU温度波动等),它将开始产生不太安全的伪随机数。这些都是由一个强大的生成器生成的,但取决于您的应用程序,它们可能不够随机。在Unix系统上,/dev/random将在等待更多熵时阻塞,而{}将开始生成伪随机数。在

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

我选择os.urandom。在我检查过的所有(最近)Python实现中,它只需打开到/dev/urandom或其他非Linux平台上的等效设备的无缓冲连接即可。在

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

  • 它仍然从/dev/urandom(在Linux上)中获取熵,因此如果操作系统被破坏,PyCrypto的Crypto.Random也将被破坏(破坏了它的目的)
  • 这种选择适得其反,因为很难处理forking和相同的熵被不同进程重用的情况(参见CVE-2013-1445)。在
  • 单元测试根本没有覆盖Fortuna代码,而且Fortuna算法本身也没有测试向量。这一点就迫使你做出一个(大的)信仰飞跃。在

在您给出的链接中,选择urandom()的唯一原因是它引入了更少的代码(操作系统实现了“大部分”,而os.urandom()是内置于Python中的)。在

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

就质量而言,任何一种方法都应该是好的。我更喜欢urandom(),因为我了解它的作用;我从来没有深入研究过{}的本质。但是urandom()在一些环境中的使用受到了批评。Click this并向下滚动到开始的部分

Gutterman, Pinkas, & Reinman in March 2006 published a detailed cryptographic analysis of the Linux random number generator ...

相关问题 更多 >

    热门问题