擅长:python、mysql、java
<p>我选择<code>os.urandom</code>。在我检查过的所有(最近)Python实现中,它只需打开到<code>/dev/urandom</code>或其他非Linux平台上的等效设备的<em>无缓冲</em>连接即可。在</p>
<p>另一方面,PyCrypto的<code>Crypto.Random</code>是基于Fortuna的非常复杂的包装器。这样复杂的构造可能是为了减轻底层操作系统的一些缺陷。不幸的是:</p>
<ul>
<li>它仍然从<code>/dev/urandom</code>(在Linux上)中获取熵,因此如果操作系统被破坏,PyCrypto的<code>Crypto.Random</code>也将被破坏(破坏了它的目的)</li>
<li>这种选择适得其反,因为很难处理forking和相同的熵被不同进程重用的情况(参见<a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-1445" rel="noreferrer">CVE-2013-1445</a>)。在</li>
<li>单元测试根本没有覆盖Fortuna代码,而且Fortuna算法本身也没有测试向量。这一点就迫使你做出一个(大的)信仰飞跃。在</li>
</ul>