我想调查和研究Python 3.7的os.urandom()
函数的代码。我看了相关的标准库os.py
,但它既没有在那里定义,也没有被导入到那里。我还尝试使用grep查找定义:
/usr/lib/python3.7 $ grep -rFl "def urandom" 2> /dev/null
但是没有找到任何结果。我怀疑os.urandom()函数中有一些神奇的事情发生。我在哪里可以找到这个函数的定义以供研究和加密分析?
我想调查和研究Python 3.7的os.urandom()
函数的代码。我看了相关的标准库os.py
,但它既没有在那里定义,也没有被导入到那里。我还尝试使用grep查找定义:
/usr/lib/python3.7 $ grep -rFl "def urandom" 2> /dev/null
但是没有找到任何结果。我怀疑os.urandom()函数中有一些神奇的事情发生。我在哪里可以找到这个函数的定义以供研究和加密分析?
os
模块定义的许多名称都由Modules/posixmodule.c
处理,无论是在POSIX系统上还是Windows系统上。请注意,源代码是用C而不是Python编写的,因为访问系统函数需要本地代码。
您可以在os.py
source code中看到这一点,它根据当前操作系统导入posix
或nt
,其中这两个名称都是从上面的posixmodule.c
文件编译而来,但被重命名以更好地反映平台并指示两种变体之间的功能差异(nt
变体提供的功能较少)。
查看 os_urandom_impl()
函数 了解 os.urandom()
的实现细节。这将委托给一个内部函数 _PyOS_URandom()
,与 Python 启动过程中需要的其他辅助函数一起,在 Python/bootstrap_hash.c
中定义。
getrandom()
系统调用(例如Linux、Solaris),则首选该函数,其次使用getentropy()
(OpenBSD),只有在这些调用不可用时Python才会从/dev/urandom
读取。因此,dev_urandom()
函数是最后一道选择。 - Martijn Pieters