PyCrypto 模块中的 Random 从哪里获取其随机字节?
Where does Random in PyCrypto module get its random bytes from?
在使用 C++
进行 WinAPI 编程期间,我注意到我们可以调用函数 CryptGenRandom
在 Windows CryptoAPI 的上下文中生成随机字节。如果我们深入到系统细节,这些字节实际上是从 Windows 上的 advapi32.dll
生成的。
在 Python
中,我知道有两种方法可以生成可用于加密的随机字节:
from Crypto.Random import get_random_bytes
from secrets import token_bytes
我想知道这些模块是否仍然在某个地方深处调用 advapi32.dll
on Windows 来生成所需的随机字节。或者,他们是否有生成完全独立于 Windows 动态库(或 DLLs
)的随机字节的方法?
深入研究代码(您希望在其中找到文档),您会发现两者似乎都依赖于 os.urandom
,而后者又依赖于 CryptGenRandom
, according to the documentation :
On Windows, it will use CryptGenRandom()
.
现在反过来一般都会用到微软的CSP,具体用什么要看系统。
通常您希望依赖 OS 熵,因为要为特定的运行时获得足够的熵是很棘手的。如今,这些 RNG 是非常值得信赖的资源,而且速度也相对较快,因此实现 CSPRNG 通常没有多大意义,更不用说将熵源放入高级语言库中了。
在使用 C++
进行 WinAPI 编程期间,我注意到我们可以调用函数 CryptGenRandom
在 Windows CryptoAPI 的上下文中生成随机字节。如果我们深入到系统细节,这些字节实际上是从 Windows 上的 advapi32.dll
生成的。
在 Python
中,我知道有两种方法可以生成可用于加密的随机字节:
from Crypto.Random import get_random_bytes
from secrets import token_bytes
我想知道这些模块是否仍然在某个地方深处调用 advapi32.dll
on Windows 来生成所需的随机字节。或者,他们是否有生成完全独立于 Windows 动态库(或 DLLs
)的随机字节的方法?
深入研究代码(您希望在其中找到文档),您会发现两者似乎都依赖于 os.urandom
,而后者又依赖于 CryptGenRandom
, according to the documentation :
On Windows, it will use
CryptGenRandom()
.
现在反过来一般都会用到微软的CSP,具体用什么要看系统。
通常您希望依赖 OS 熵,因为要为特定的运行时获得足够的熵是很棘手的。如今,这些 RNG 是非常值得信赖的资源,而且速度也相对较快,因此实现 CSPRNG 通常没有多大意义,更不用说将熵源放入高级语言库中了。