【问题标题】:Python's pycrypto library for random number generation vs os.urandom用于随机数生成的 Python pycrypto 库与 os.urandom
【发布时间】:2013-12-08 22:33:12
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • @U2EF1 对于像 CSPRNG 的正确性这样重要且难以验证的事情,您必须提供的不仅仅是临时断言。
  • ssl.RAND_bytes() docs 建议阅读 Wikipedia 以了解 CSPRNG 的要求。
  • 我特别担心的是,我打算用这些来生成随机数,但我担心有一天我会生成一些,而第二天生成器的状态是一样的,或者它会生成相同的“随机”(不是真的)数字。

标签: python random pycrypto


【解决方案1】:

我选择os.urandom。在我检查的所有(最近的)Python 实现中,它通过简单地打开到/dev/urandom 或其他非Linux 平台上的等效设备的无缓冲 连接来做正确的事情。

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

  • 它仍然从/dev/urandom 中提取熵(在 Linux 上),所以如果操作系统坏了,PyCrypto 的 Crypto.Random 也会坏掉(违背了它的目的)
  • 这种选择适得其反,因为很难处理分叉以及相同熵被不同进程重用的情况(请参阅CVE-2013-1445)。
  • 单元测试完全没有涵盖 Fortuna 代码,并且 Fortuna 算法本身不附带测试向量。仅此一项就迫使您做出(大)信仰飞跃。

【讨论】:

    【解决方案2】:

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

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

    就质量而言,任何一种方式都可以正常工作。我更喜欢urandom(),因为我了解它的作用;我从来没有深入了解过PyCrypto。但是urandom() 因在某些 环境中的使用而受到批评。 Click this 并向下滚动到开始的部分

    Gutterman、Pinkas 和 Reinman 在 2006 年 3 月发表了一份详细的 Linux随机数生成器的密码分析...

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-10-18
        • 2021-08-14
        • 1970-01-01
        • 2013-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多