【问题标题】:Where can I find the source code of os.urandom()?我在哪里可以找到 os.urandom() 的源代码?
【发布时间】:2019-06-03 04:24:17
【问题描述】:

想调查研究python 3.7的os.urandom()函数的代码。 我查看了各自的标准库的os.py,但它既没有在那里定义,也没有在那里导入。 我也尝试用 grep 来定义:

/usr/lib/python3.7 $ grep -rFl "def urandom" 2> /dev/null 但什么都没有。 我怀疑 os.urandom() 发生了一些神奇的事情。 在哪里可以找到用于研究和密码分析的函数定义?

【问题讨论】:

标签: python python-3.x random python-internals


【解决方案1】:

os 模块定义的许多名称都由Modules/posixmodule.c 处理,无论是在POSIX 系统上还是在Windows 上。请注意,源代码在 C 中,而不是 Python,因为访问系统函数需要本机代码。

您可以看到这是os.py source code,它基于当前操作系统导入posixnt,这两个名称都是从上面的posixmodule.c 文件编译而来,但为了更好地反映平台而重命名并表明两个变体之间的功能不同(nt 变体提供的功能较少)。

os.urandom()的实现细节见os_urandom_impl() function。这将委托给一个内部函数 _PyOS_URandom(),它与 Python 启动过程早期所需的其他辅助函数一起在 Python/bootstrap_hash.c 中定义。

【讨论】:

  • 谢谢。我将电源线追溯到github.com/python/cpython/blob/3.7/Python/bootstrap_hash.c#L306,这基本上就是我正在寻找的(WIN32 不支持我atm。)。
  • @RichardNeumann: dev_urandom() 是最后被调用的函数。如果您使用的操作系统支持getrandom() system call,那么这是首选(Linux、Solaris),接下来将使用getentropy()(OpenBSD),只有当这些调用不可用时,Python 才会从/dev/urandom 读取。跨度>
  • 感谢您的提示。我一定跳过了。
猜你喜欢
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多