Windows系统下os.urandom()是否始终调用win32_urandom?
Windows下os.urandom()是否始终调用CryptGenRandom()?
背景
在CPython 3.7中,os.urandom()会调用bootstrap_hash.c文件里的_PyOS_URandom()函数,该函数又会调用同文件的pyurandom函数。pyurandom函数上方的注释提到它会按优先级尝试四个随机数生成函数,其中第一个是Windows平台的CryptGenRandom(),由此产生疑问:Windows系统下,该函数是否始终使用CryptGenRandom(),还是会在调用失败后尝试另外三个函数?
代码分析与结论
从pyurandom函数的开头实现可以明确:
static int pyurandom(void *buffer, Py_ssize_t size, int blocking, int raise) { #if defined(PY_GETRANDOM) || defined(PY_GETENTROPY) int res; #endif if (size < 0) { if (raise) { PyErr_Format(PyExc_ValueError, "negative argument not allowed"); } return -1; } if (size == 0) { return 0; } #ifdef MS_WINDOWS return win32_urandom((unsigned char *)buffer, size, raise);
当代码在Windows平台编译时,MS_WINDOWS宏会被定义,此时pyurandom函数会直接调用win32_urandom并返回其结果,不会执行后续其他平台的代码分支。
而win32_urandom函数内部就是对Windows系统API CryptGenRandom()的封装,且如果win32_urandom调用失败,会直接返回错误状态,不会回到pyurandom函数去尝试另外三个非Windows平台的函数。
结论:在Windows系统下,os.urandom()对应的底层实现始终会优先调用CryptGenRandom(),不会在调用失败后尝试另外三个函数。
内容的提问来源于stack exchange,提问作者Riemann
相关产品推荐
相关产品推荐

