我正在使用M2Crypto库在Python webapp中生成PKCS#7签名 . M2Crypto 's example code includes a line to seed OpenSSL'来自文件的PRNG:

from M2Crypto import BIO, Rand, SMIME

def makebuf(text):
    return BIO.MemoryBuffer(text)

# Make a MemoryBuffer of the message.
buf = makebuf('a sign of our times')

# Seed the PRNG.
Rand.load_file('randpool.dat', -1)

# Instantiate an SMIME object; set it up; sign the buffer.
s = SMIME.SMIME()
s.load_key('signer_key.pem', 'signer.pem')
p7 = s.sign(buf, SMIME.PKCS7_DETACHED)

我的应用程序正在初始化SMIME上下文并使用它来签署多个消息 . 从上面的代码来看,我不清楚如何播种PRNG .

  • 我应该在应用程序启动时或每次签名之前播种一次吗?

  • 我应该使用什么作为熵源?

  • 如果应用程序运行很长时间,我是否需要对熵耗尽做些什么?


OpenSSL的documentation表示:

在提供/ dev / urandom的系统上,随机性设备用于透明地播种PRNG .

我的代码将在Ubuntu中运行,因此上述内容表明PRNG将自动播种 . 但another documentation page说:

urandom设备可能缺少足够的熵以满足您的需求,您可能希望立即从/ dev / random重新设置它 .

我不知道如何评估 /dev/urandom 是否提供"sufficient entropy for [my] needs" .

有一个函数 RAND_status() 应该表示是否"the PRNG has been seeded with enough data",但是不清楚这对于实际目的意味着什么 .