GNU随机数据的来源

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年7月11日 (二) 05:57的版本 (创建页面,内容为“shuf、shred和sort命令有时需要随机数据来完成它们的工作。例如,'sort -R'必须随机选择一个哈希函数,并且它需要随机数据来进行这个选择。 默认情况下,这些命令使用由少量熵初始化的内部伪随机生成器,但可以通过--random-source=file选项指定使用外部源。如果文件不包含足够的字节,则会报错。 例如,设备文件/dev/urandom可以用作随机数据的来源。…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

shuf、shred和sort命令有时需要随机数据来完成它们的工作。例如,'sort -R'必须随机选择一个哈希函数,并且它需要随机数据来进行这个选择。


默认情况下,这些命令使用由少量熵初始化的内部伪随机生成器,但可以通过--random-source=file选项指定使用外部源。如果文件不包含足够的字节,则会报错。


例如,设备文件/dev/urandom可以用作随机数据的来源。通常,该设备会将来自设备驱动程序和其他源的环境噪声收集到熵池中,并使用该池生成随机位。如果熵池的数据不足,设备会重新使用内部池来产生更多位,使用具有密码学安全性的伪随机数生成器。但请注意,该设备并非专为大量随机数据生成而设计,速度相对较慢。


对于大多数实际用途来说,/dev/urandom已经足够了,但需要对私密数据进行高值或长期保护的应用程序可能需要像/dev/random或/dev/arandom这样的替代数据源。可用的数据源取决于您的操作系统。


为了复现先前调用命令的结果,您可以将一些随机数据保存到文件中,然后在先前和后续的命令调用中将该文件用作随机源。除了依赖文件外,可以根据种子值生成可复现的任意量的伪随机数据,例如:


get_seeded_random()
{
  seed="$1"
  openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \
    </dev/zero 2>/dev/null
}

shuf -i1-100 --random-source=<(get_seeded_random 42)