gpt4 book ai didi

python - python SystemRandom/os.urandom 是否总是有足够的熵来进行良好的加密

转载 作者:IT老高 更新时间:2023-10-28 20:42:09 31 4
gpt4 key购买 nike

我有一个密码生成器:

import random, string

def gen_pass():
foo = random.SystemRandom()
length = 64
chars = string.letters + string.digits
return ''.join(foo.choice(chars) for _ in xrange(length))

根据文档,SystemRandom 使用 os.urandom,它使用 /dev/urandom 抛出随机加密位。在 Linux 中,您可以从 /dev/urandom/dev/random 中获取随机位,它们都使用内核可以获得的任何熵。可以使用 tail/proc/sys/kernel/random/entropy_avail 检查可用的熵量,这将返回一个数字,例如:129。数字越高,可用的熵越多。 /dev/urandom/dev/random 的区别在于 /dev/random 只有在 entropy_avail 足够高(例如至少 60)并且 /dev/urandom 将始终吐出位。文档说 /dev/urandom 对加密很有用,您只需将 /dev/random 用于 ssl 证书等。

我的问题是 gen_pass 是否总是适合制作强加密级密码?如果我尽快调用此函数,是否会因为熵池已耗尽而停止获取强加密位?

问题也可能是为什么 /dev/urandom 总是 产生强加密位 并且 不关心 entropy_avail

/dev/urandom 有可能被设计成它的带宽被你猜到的周期数所限制,这与熵的数量相关,但这是推测,我可以找不到答案。

这也是我的第一个 stackoverflow 问题,所以请批评我。我担心当知道答案的人可能知道背景时,我提供了很多背景。

谢谢

更新

在读取 /dev/urandom 时,我编写了一些代码来查看熵池:

import subprocess
import time

from pygooglechart import Chart
from pygooglechart import SimpleLineChart
from pygooglechart import Axis

def check_entropy():
arg = ['cat', '/proc/sys/kernel/random/entropy_avail']
ps = subprocess.Popen(arg,stdout=subprocess.PIPE)
return int(ps.communicate()[0])

def run(number_of_tests,resolution,entropy = []):
i = 0
while i < number_of_tests:
time.sleep(resolution)
entropy += [check_entropy()]
i += 1
graph(entropy,int(number_of_tests*resolution))

def graph(entropy,rng):
max_y = 200
chart = SimpleLineChart(600, 375, y_range=[0, max_y])
chart.add_data(entropy)
chart.set_colours(['0000FF'])
left_axis = range(0, max_y + 1, 32)
left_axis[0] = 'entropy'
chart.set_axis_labels(Axis.LEFT, left_axis)
chart.set_axis_labels(Axis.BOTTOM,['time in second']+get_x_axis(rng))
chart.download('line-stripes.png')

def get_x_axis(rng):
global modnum
if len(filter(lambda x:x%modnum == 0,range(rng + 1)[1:])) > 10:
modnum += 1
return get_x_axis(rng)
return filter(lambda x:x%modnum == 0,range(rng + 1)[1:])

modnum = 1
run(500,.1)

如果运行这个并同时运行:

while 1 > 0:
gen_pass()

然后我很可靠地得到一个如下所示的图表: enter image description here

在运行 cat/dev/urandom 时制作图表看起来更微笑,而 cat/dev/random 会很快下降并保持在低位(这也只会读出像每 3 秒左右一个字节)

更新

如果我运行相同的测试但有六个 gen_pass() 实例,我会得到: enter image description here

所以看起来有些东西使我有足够的熵。我应该测量密码生成率并确保它实际上是有上限的,因为如果不是,那么可能会发生一些可疑的事情。

更新

我找到了 email chain

这表示一旦池中只有 128 位,urandom 将停止提取熵。这与上述结果非常一致,这意味着在这些测试中我经常产生垃圾密码。

我之前的假设是,如果 entropy_avail 足够高(比如 64 位以上),那么 /dev/urandom 输出就很好。情况并非如此,似乎 /dev/urandom 旨在为 /dev/random 留下额外的熵,以备不时之需。

现在我需要找出 SystemRandom 调用需要多少真正的随机位。

最佳答案

/dev/random 的输出之间存在细微差别和 /dev/urandom .正如已经指出的那样,/dev/urandom不阻塞。这是因为它的输出来自一个伪随机数生成器,它是从 /dev/random 中的“真实”随机数中播种的。 .

/dev/urandom 的输出几乎总是足够随机的——它是一个带有随机种子的高质量 PRNG。如果您真的需要更好的随机数据源,您可以考虑使用带有硬件随机数生成器的系统——我的上网本有一个 VIA C7在其中,它可以生成大量适当的随机数据(我从 /dev/random 中得到一致的 99.9kb/s,从 /dev/urandom 中得到 545kb/s)。

顺便说一句,如果您正在生成密码,那么您可能需要查看 pwgen -- 它为你提供了很好的发音密码:)。

关于python - python SystemRandom/os.urandom 是否总是有足够的熵来进行良好的加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5480131/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com