我有一个密码生成器:
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))
Run Code Online (Sandbox Code Playgroud)
根据文档,SystemRandom使用os.urandom,它使用/ dev/urandom来丢弃随机的cryto位.在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是否适合制作强大的加密级密码?如果我尽快调用此函数,我会在某个时刻停止获取强大的cryto位,因为熵池已经耗尽了吗?
这个问题也可能是为什么的/ dev/urandom的总是产生强烈cryto位并不在乎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 …Run Code Online (Sandbox Code Playgroud)