我想生成随机字符串的令牌和密钥。生成它们的可接受方法是什么?
通过标准库函数生成两个 UUID 并将它们连接起来是否可以接受?
os.urandom提供对操作系统随机数生成器的访问
编辑:如果您使用的是 linux 并且非常关心安全性,您应该直接使用/dev/random/。此调用将阻塞,直到有足够的熵可用。
计算机(没有特殊硬件)只能生成伪随机数据。一段时间后,所有伪随机数生成器将开始重复自己。它在重复之前可以生成的数据量称为周期。
Mersenne Twister是一个非常流行的伪随机数(也在 Pythonrandom
模块中使用)生成器。但它被认为不适合加密目的,因为在仅观察相对少量的迭代后预测下一次迭代相当容易。
请参阅有关加密安全伪随机数生成器的 Wikipedia 页面,以获取似乎合适的算法列表。
FreeBSD、OpenBSD 和 OS X 等操作系统在其设备上使用Yarrow算法。urandom
所以在那些系统上使用os.urandom
可能没问题,因为它被认为是加密安全的。
当然你需要使用什么很大程度上取决于你的要求有多高;您希望它有多安全?一般来说,我建议您使用已发布和测试的算法实现。编写自己的实现很容易出错。
编辑:计算机可以通过观察例如中断到达的时间来收集随机数据。然而,这并不能提供大量的随机数据,因此它经常被用来作为 PRNG 的种子。