- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
请引用os和secrets的文档:
os.getrandom(大小,标志= 0)
Get up to size random bytes. The function can return less bytes than requested.
getrandom() relies on entropy gathered from device drivers and other sources of environmental noise.
/dev/random
?
On Linux, if the getrandom() syscall is available, it is used in blocking mode: block until the system urandom entropy pool is initialized (128 bits of entropy are collected by the kernel).
os.getrandom()
吗?由于该函数返回的字节数少于请求的字节数,因此应将应用程序级别的CSPRNG作为以下命令运行
def rng():
r = bytearray()
while len(r) < 32:
r += os.getrandom(1)
return bytes(r)
os.getrandom(32)
,程序将在必要时一直等待直到收集到32个字节为止?
The flags argument is a bit mask that can contain zero or more of the following values ORed together: os.GRND_RANDOM and GRND_NONBLOCK.
On Linux, if the getrandom() syscall is available, it is used in blocking mode: block until the system urandom entropy pool is initialized (128 bits of entropy are collected by the kernel).
Changed in version 3.6.0: On Linux, getrandom() is now used in blocking mode to increase the security.
By default, when reading from /dev/random, getrandom() blocks if no random bytes are available, and when reading from /dev/urandom, it blocks if the entropy pool has not yet been initialized.
If this bit is set, then random bytes are drawn from the /dev/random pool instead of the /dev/urandom pool.
os.GRND_RANDOM = 1
os.getrandom(32) # or use the rng() defined above
The secrets module is used for generating cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets.
secrets.token_bytes(32)
The secrets module provides access to the most secure source of randomness that your operating system provides.
os.getrandom
后备的
os.urandom
?因此,如果您希望“如果无法评估内部状态而优雅退出”,这不是一个好选择吗?
To be secure against brute-force attacks, tokens need to have sufficient randomness. Unfortunately, what is considered sufficient will necessarily increase as computers get more powerful and able to make more guesses in a shorter period. As of 2015, it is believed that 32 bytes (256 bits) of randomness is sufficient for the typical use-case expected for the secrets module.
/dev/random
,以确保在生成密钥时内部状态已达到256位?
最佳答案
经过研究后,我可以回答我自己的问题。os.getrandom
是Linux内核3.17及更高版本中提供的getrandom()
syscall的包装。该标志是一个数字(0、1、2或3),它通过以下方式对应于位掩码:
使用ChaCha20 DRNG获得GETRANDOM
os.getrandom(32,标志= 0)
GRND_NONBLOCK = 0 (=Block until the ChaCha20 DRNG seed level reaches 256 bits)
GRND_RANDOM = 0 (=Use ChaCha20 DRNG)
= 00 (=flag 0)
当不需要与Python 3.5和3.17之前的内核向后兼容时,这是在所有平台(包括现场发行版)上与所有Python 3.6程序一起使用的一个很好的默认值。
On Linux, getrandom(0) blocks until the kernel initialized urandom with 128 bits of entropy.
get_random_bytes()
函数
的调用者使用128位限制,如果是,则该代码是为了正确等待
add_random_ready_callback()
函数的触发而进行的。 (不等待就意味着
get_random_bytes()
可能返回不安全的随机数。)根据第112页
When reaching the state of being fully seeded and thus having the ChaCha20 DRNG seeded with 256 bits of entropy -- the getrandom system call unblocks and generates random numbers.
GRND_NONBLOCK = 1 (=If the ChaCha20 DRNG is not fully seeded, raise BlockingIOError instead of blocking)
GRND_RANDOM = 0 (=Use ChaCha20 DRNG)
= 01 (=flag 1)
如果应用程序在等待ChaCha20 DRNG完全播种时需要执行其他任务,则该功能很有用。 ChaCha20 DRNG几乎总是在引导期间完全播种,因此
flags=0
最有可能是更好的选择。需要围绕它的try-except逻辑。
blocking_pool
设备文件访问
/dev/random
。设计池时要考虑到熵耗尽的想法。此想法仅在尝试创建一次性填充(争取信息理论安全性)时适用。为此目的,
blocking_pool
中的熵质量尚不清楚,并且性能确实很差。对于其他用途,正确播种的DRNG足够了。
blocking_pool
可能更安全的唯一情况是使用4.17之前的内核,这些内核在编译时设置了
CONFIG_RANDOM_TRUST_CPU
标志,并且CPU HWRNG碰巧有后门。由于在那种情况下,ChaCha20 DRNG最初是使用
RDSEED
/
RDRAND
指令进行播种的,因此不良的CPU HWRNG将是一个问题。但是,根据BSI报告的第134页:
[As of kernel version 4.17] The Linux-RNG now considers the ChaCha20 DRNG fully seeded after it received 128 bit of entropy from the noise sources. Previously it was sufficient that it received at least 256 interrupts.
input_pool
混合了熵之后,才将ChaCha20 DRNG视为完全播种,该熵将来自所有LRNG噪声源的随机事件合并在一起。
os.getrandom()
与
2
或
3
标志一起使用,熵来自
blocking_pool
,后者从
input_pool
接收熵,继而又从几个其他噪声源接收熵。 ChaCha20 DRNG也从
input_pool
重新播种,因此CPU RNG对DRNG状态没有永久控制权。一旦发生这种情况,ChaCha20 DRNG和
blocking_pool
一样安全。
GRND_NONBLOCK = 0 (=Return 32 bytes or less if entropy counter of blocking_pool is low. Block if no entropy is available.)
GRND_RANDOM = 1 (=Use blocking_pool)
= 10 (=flag 2)
这需要一个运行该函数的外部循环,并将返回的字节存储到缓冲区中,直到缓冲区大小为32个字节为止。这里的主要问题是由于
blocking_pool
的阻塞行为,获取所需的字节可能需要很长时间,尤其是在其他程序也从同一syscall或
/dev/random
请求随机数的情况下。另一个问题是,与使用
os.getrandom(32, flags=2)
标志相比,使用
3
的循环花费更多的空闲时间等待随机字节(请参见下文)。
GRND_NONBLOCK = 1 (=return 32 bytes or less if entropy counter of blocking_pool is low. If no entropy is available, raise BlockingIOError instead of blocking).
GRND_RANDOM = 1 (=use blocking_pool)
= 11 (=flag 3)
如果应用程序在等待
blocking_pool
具有一定量的熵时需要执行其他任务,则该功能很有用。需要围绕它的try-except逻辑以及一个运行该函数并将返回的字节存储到缓冲区中直到缓冲区大小为32字节的外部循环。
/dev/urandom
设备文件读取不会阻塞。无法保证随机数的质量,这是不好的。这是最不推荐的选项。
os.urandom(n)
提供尽力而为的安全性:
os.urandom(32)
与
os.getrandom(32, flags=0)
等效。在较旧的内核上,它安静地回落到
open('/dev/urandom', 'rb').read(32)
的等效值,这不好。
os.getrandom(32, flags=0)
,因为它不能退回到不安全模式。
open('/dev/urandom', 'rb').read(32)
,这不好。由于
os.getrandom()
不可用,因此不应使用Python3.5。
os.urandom()
的包装器。密钥的默认长度为32字节(256位)。在Linux 3.17及更高版本上,
secrets.token_bytes(32)
与
os.getrandom(32, flags=0)
等效。在较旧的内核上,它安静地回落到
open('/dev/urandom', 'rb').read(32)
的等效值,这不好。
os.getrandom(32, flags=0)
,因为它不能退回到不安全模式。
os.getrandom(32, flags=0)
。
import random
random.<anything>()
对于创建密码,加密密钥等,
绝对不安全。import random
sys_rand = random.SystemRandom()
可以安全地用于和密码! sys_rand.sample(list_of_password_chars, counts=password_length)
生成随 secret 码不是安全的,因为用documentation引用,sample()
方法用于“随机采样而无需替换”。这意味着密码中的每个后续字符都保证不包含任何先前的字符。这将导致密码为而不是统一随机的。sample()
方法用于随机采样,而无需替换。 choices()
方法用于替换的随机采样
。但是,在choices
上引用documentation,The algorithm used by choices() uses floating point arithmetic for internal consistency and speed. The algorithm used by choice() defaults to integer arithmetic with repeated selections to avoid small biases from round-off error.
choices()
方法向采样的密码引入了密码学上不可忽略的偏差。因此, random.choices()不得用于密码/密钥生成! sys_random.choice()
方法使用整数算法而不是浮点算法,因此使用重复调用sys_random.choice()
生成密码/密钥是安全的。secrets.choice()
是sys_random.choice()
的包装,并且可以与random.SystemRandom().choice()
互换使用:它们是同一回事。import secrets
# On standard Linux systems, use a convenient dictionary file.
# Other platforms may need to provide their own word-list.
with open('/usr/share/dict/words') as f:
words = [word.strip() for word in f]
passphrase = ' '.join(secrets.choice(words) for i in range(4))
如何确保生成的密码短语符合某些安全级别,例如128位?import math
import secrets
def generate_passphrase() -> str:
PASSWORD_MIN_BIT_STRENGTH = 128 # Set desired minimum bit strength here
with open('/usr/share/dict/words') as f:
wordlist = [word.strip() for word in f]
word_space = len(wordlist)
word_count = math.ceil(math.log(2 ** PASSWORD_MIN_BIT_STRENGTH, word_space))
passphrase = ' '.join(secrets.choice(wordlist) for _ in range(word_count))
# pwd_bit_strength = math.floor(math.log2(word_space ** word_count))
# print(f"Generated {pwd_bit_strength}-bit passphrase.")
return passphrase
关于linux - 关于Python3.6 os.urandom/os.getrandom/secrets的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42190663/
在 Linux 中,/dev/urandom/ 的随机性到底有多大?它被认为是安全的吗? 还有可能获得 1 的流吗? 最佳答案 注意 4.5 年后:这是个糟糕的建议。参见 these 之一links了
如果您想从/dev/urandom 保证读取 N 个字节,执行单个读取调用是否安全并保证您获得 N 个字节 - 或者是否有一些操作系统不提供这种保证,并且可能从/dev/urandom 产生一个简短的
我正在进行随机数生成领域的研究,我需要演示著名的“P 和 Q”论文 (here) 中的“启动时熵洞”。我们将同时假脱机处理同一个最小 Linux 虚拟机的两个副本,我们期望它们的/dev/urando
我们在 Linux、Solaris 和 AIX 平台上使用 tomcat、weblogic、websphere、apache(主要是 java)。对于加密,我们使用 SSL。要生成私钥/公钥对,我们使
我需要生成一些只能接受一定范围字符的 token ,[a-zA-Z0-9_] 我正在尝试使用 binascii.b2a_base64(os.urandom(64)),它具有其他字符(例如 +)并导致问
在哪里可以找到有关 os.urandom 的完整教程或文档?我需要获取一个随机 int 以从 80 个字符的字符串中选择一个 char。 最佳答案 如果你只需要一个随机整数,你可以使用random.r
似乎在类 unix 系统中使用纯 C,/dev/urandom 中的 fread 是提取高质量随机字节的最简单方法。我需要运行一个模拟,每秒需要大约 10k 个 32 位随机数,它可能会运行几天。 /
这是一个关于/dev/urandom的Linux内核实现的问题.如果用户要求读取大量数据(千兆字节)并且熵没有添加到池中,是否可以根据当前数据预测从 urandom 生成的下一个数据? 通常的情况是当
我有这段 C 代码,我想知道是否可能如何绕过此检查? int fd, password, input; fd = open("/dev/urandom", 0); read(fd, &password
我正在循环中读取 dev/urandom 来为模拟创建随机数。它不起作用,我最终将问题追溯到以下代码示例 int myFile = open("/dev/urandom", O_RDONLY); be
我需要许多加密安全数字,所以我考虑从 /dev/urandom 中提取随机性,然后将其“转换”为(比如)unsigned long long int .我想它应该是非常有效的,而且它似乎是加密安全的,
不知何故我的 python 坏了并发出错误: jseidel@EDP15:/etc/default$ python -c 'import random' Traceback (most recent
想研究学习python 3.7的os.urandom()函数的代码。我查看了相应标准库的 os.py,但既没有在那里定义,也没有在那里导入。我还尝试 grep 获取定义: /usr/lib/pytho
我正在编写一个读取标准输入的程序。我有一个这样的循环: while(read(0, buffer, sizeof(buffer)) > 0) 它工作正常,但是当我执行 cat/dev/urandom
我正在尝试生成随机数以供我的 Perl 代码中的某些特定用途。 我能够弄清楚 Linux 的命令并且它工作正常。 cat /dev/urandom | tr -dc 'a-zA-Z0-9-_!@#$%
我有一个需要的应用程序 numpy.random.normal但来自神秘的 PRNG 源。 Numpy 似乎没有提供这个选项。 我能找到的最好的是numpy.random.entropy.random
我看到的所有地方都说 linux 上的 /dev/urandom 是“随机的”,但我找不到任何来源引用什么样的随机“随机”。我希望它在 0x01 到 0xff 字节上接近统一。如果我想对此进行测试,那
我需要获取由硬件设备生成的高速随机数流,并将其拆分为不同的子流。出于测试目的,我考虑将/dev/urandom 作为数据源。有没有它的linux工具?如果没有 - 请帮助使用 bash 脚本来完成它。
我正在使用函数: private function random($len) { if (@is_readable('/dev/urandom')) { $f=
我正在用 php 5.4 开发一个站点,我想知道使用哪个来生成随机盐以确保密码安全性更好? $salt = sha1(openssl_random_pseudo_bytes(23)); 或 $seed
我是一名优秀的程序员,十分优秀!