获取随机字节大小。该函数可以返回少于请求的字节数。
getrandom()依赖于从设备驱动程序和其他环境噪声源收集的熵。
这是否意味着来自/dev/random
?
在Linux上,如果getrandom()系统调用可用,则在阻塞模式下使用:阻塞,直到初始化系统urandom熵池(内核收集128位熵)。
为了确保内核状态不佳的内核CSPRNG 从不使用,我应该使用os.getrandom()
?由于该函数可以返回少于请求的字节数,因此我应该将应用程序级别CSPRNG运行为类似
def rng():
r = bytearray()
while len(r) < 32:
r += os.getrandom(1)
return bytes(r)
确保最大安全性?我明确地希望所有不支持阻塞的系统,直到urandom entropy池被初始化为无法运行支持它的程序和系统,等待。这是因为软件必须是安全的,即使它是从开始时零熵的实时CD运行的。
或者阻塞意味着我做os.getrandom(32)
,程序会在必要时等待,直到收集到32个字节为止?
flags参数是一个位掩码,可以包含零个或多个以下值或ORed:os.GRND_RANDOM和GRND_NONBLOCK。
有人可以请ELI5如何运作吗?
在Linux上,如果getrandom()系统调用可用,则在阻塞模式下使用:阻塞,直到初始化系统urandom熵池(内核收集128位熵)。
所以urandom悄然回归到非阻塞的CSPRNG,它在旧的Linux内核版本中不知道它的内部播种状态?
版本3.6.0中已更改:在Linux上,getrandom()现在用于阻止模式以提高安全性。
这与os.getrandom()有关吗?这是一个较低级别的电话吗?两者是否相同?
默认情况下,当从/ dev / random读取时,如果没有可用的随机字节,则getrandom()会阻塞,当从/ dev / urandom读取时,如果熵池尚未初始化,则会阻塞。
所以它是os.getrandom中的0标志(size,flag = 0)?
如果设置了该位,则从/ dev / random池而不是/ dev / urandom池中抽取随机字节。
os.getrandom()标志的ORing是什么意思? os.getrandom(flags = 1)如何判断我是否要启用os.GRND_NONBLOCK或os.GRND_RANDOM。或者我需要像这样设置它:
os.GRND_RANDOM = 1
os.getrandom(32) # or use the rng() defined above
秘密模块用于生成适用于管理密码,帐户身份验证,安全令牌和相关机密等数据的加密强随机数。
生成随机字节的唯一明确方法是
secrets.token_bytes(32)
“秘密”模块可以访问操作系统提供的最安全的随机源。
这应该意味着os.getrandom
后退到os.urandom
?因此,如果内部状态无法评估,那么如果您希望优雅退出,那么这不是一个好的选择吗?
为了抵御暴力攻击,令牌需要具有足够的随机性。不幸的是,随着计算机变得更强大并且能够在更短的时间内做出更多的猜测,被认为足够的东西必然会增加。截至2015年,相信32个字节(256位)的随机性足以满足秘密模块预期的典型用例。
然而阻塞在128位内部状态停止,而不是256位。大多数对称密码都有256位版本。
所以我应该确保在阻塞模式下使用/dev/random
以确保在生成密钥时内部状态已达到256位?
所以tl;博士
Python3.6中最安全的方法是在Linux(3.17或更新版本)的现场发行版中生成256位密钥,该版本在我的程序开始时内核CSPRNG内部状态中具有零熵&#39执行?
答案 0 :(得分:2)
在做了一些研究后,我可以回答我自己的问题
os.getrandom
是Linux Kernel 3.17及更新版本中提供的getrandom()
系统调用的包装器。该标志是一个数字(0,1,2或3),以下列方式对应于位掩码:
GRND_NONBLOCK = 0 (=block when urandom has less than 128 bits of entropy)
GRND_RANDOM = 0 (=use /dev/urandom)
= 00 (=flag 0)
当不需要向后兼容Python 3.5时,这是一个很好的默认设置,适用于所有Python 3.6程序。
GRND_NONBLOCK = 1 (=never block. Insecure on fresh installs / live distros.)
GRND_RANDOM = 0 (=use /dev/urandom)
= 01 (=flag 1)
仅当更安全的选项(flags=0
)可用时才可用。你不太可能需要使用它。
GRND_NONBLOCK = 0 (=return 32 bytes or less if entropy_avail counter is low)
GRND_RANDOM = 1 (=use /dev/random)
= 10 (=flag 2)
这需要一个运行该函数的外部循环,并将返回的字节存储到缓冲区,直到缓冲区大小为32字节。在使用live distro时的安全性方面,当CSPRNG内部状态收集了16个字节的熵时,flags=0
将返回32个字节。当CSPRNG内部状态具有32个字节时,循环轮询os.getrandom(flags=2)
将在缓冲区中具有32个字节的熵,因此在这种情况下flags=2
更安全。但是,如果种子系统充足,/dev/random
就不会更安全了。
GRND_NONBLOCK = 1 (=raise BlockingIOError if not enough entropy is available)
GRND_RANDOM = 1 (=use /dev/random)
= 11 (=flag 3)
如果应用程序在等待熵池有足够的熵可用时需要执行其他任务,则非常有用。然而,这可能会无限期地阻止需要熵的函数,因为一旦/dev/random
足够高,其他程序可能会从entropy_avail
加载熵。因此,最好使用flags=2
并将熵存储到缓冲区中。
Wrapper“for os.getrandom。在Linux 3.17及更新版本上,它相当于os.getrandom(32, flags=0)
,在较旧的内核上悄然回归到os.getrandom(32, flags=1)
的等价物。
始终相当于os.getrandom(32, flags=1)
os.urandom(n)
提供尽力而为的安全性,并且只应用于永远不会从实时发行/全新安装中运行的程序。
上面的Python3.6的os.urandom()
包装器。省略length参数时,默认为32。