PyCrypto 模块中的 Random 从哪里获取其随机字节?

Where does Random in PyCrypto module get its random bytes from?

在使用 C++ 进行 WinAPI 编程期间,我注意到我们可以调用函数 CryptGenRandom 在 Windows CryptoAPI 的上下文中生成随机字节。如果我们深入到系统细节,这些字节实际上是从 Windows 上的 advapi32.dll 生成的。

Python 中,我知道有两种方法可以生成可用于加密的随机字节:

我想知道这些模块是否仍然在某个地方深处调用 advapi32.dllon Windows 来生成所需的随机字节。或者,他们是否有生成完全独立于 Windows 动态库(或 DLLs)的随机字节的方法?

深入研究代码(您希望在其中找到文档),您会发现两者似乎都依赖于 os.urandom,而后者又依赖于 CryptGenRandom, according to the documentation :

On Windows, it will use CryptGenRandom().

现在反过来一般都会用到微软的CSP,具体用什么要看系统。

通常您希望依赖 OS 熵,因为要为特定的运行时获得足够的熵是很棘手的。如今,这些 RNG 是非常值得信赖的资源,而且速度也相对较快,因此实现 CSPRNG 通常没有多大意义,更不用说将熵源放入高级语言库中了。