在随机模块 python 页面(链接在这里) 上有这个警告:
警告: 出于安全目的,不应使用此模块的伪随机生成器。如果您需要加密安全的伪随机数生成器,请使用 os.urandom() 或 SystemRandom。
那么 os.urandom() 和 random 有什么区别呢?
一个比另一个更接近真正的随机数吗?
在非加密实例中,安全随机数是否会过大?
python中还有其他随机模块吗?
原文由 SPYBUG96 发布,翻译遵循 CC BY-SA 4.0 许可协议
在随机模块 python 页面(链接在这里) 上有这个警告:
警告: 出于安全目的,不应使用此模块的伪随机生成器。如果您需要加密安全的伪随机数生成器,请使用 os.urandom() 或 SystemRandom。
那么 os.urandom() 和 random 有什么区别呢?
一个比另一个更接近真正的随机数吗?
在非加密实例中,安全随机数是否会过大?
python中还有其他随机模块吗?
原文由 SPYBUG96 发布,翻译遵循 CC BY-SA 4.0 许可协议
那么 os.urandom() 和 random 有什么区别呢?
随机本身是可预测的。这意味着给定相同的种子,随机生成的数字序列是相同的。看看 这个问题 以获得更好的解释。 这个问题 也说明随机并不是真正随机的。
大多数编程语言通常都是这种情况——随机数的生成并不是真正随机的。当密码安全性不是问题或者您希望生成相同模式的数字时,您可以使用这些数字。
一个比另一个更接近真正的随机数吗?
不确定如何回答这个问题,因为无法生成真正的随机数。查看 这篇文章 或 这个问题 以获取更多信息。
由于随机生成可重复的模式,我会说 os.urandom()
肯定更“随机”
在非加密实例中,安全随机数是否会过大?
我写了以下功能,似乎没有很大的时间差异。但是,如果您不需要加密安全数字,那么使用 os.urandom()
就没有意义。再次归结为用例,你想要一个可重复的模式,你想要你的数字有多“随机”,等等?
import time
import os
import random
def generate_random_numbers(x):
start = time.time()
random_numbers = []
for _ in range(x):
random_numbers.append(random.randrange(1,10,1))
end = time.time()
print(end - start)
def generate_secure_randoms(x):
start = time.time()
random_numbers = []
for _ in range(x):
random_numbers.append(os.urandom(1))
end = time.time()
print(end - start)
generate_random_numbers(10000)
generate_secure_randoms(10000)
结果:
0.016040563583374023
0.013456106185913086
python中还有其他随机模块吗?
Python 3.6 引入了新的 秘密模块
原文由 DoesData 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5k 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
4 回答894 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
1 回答1.6k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
您可以 在 Crypto.SE 上的这个精彩回答中 了解加密安全 RNG 的区别。
random
和系统 RNG 之间的主要区别urandom
是用例之一。random
实现确定性 PRNG。有些场景正是您想要的。例如,当您有一个包含要测试的随机元素的算法时,您需要这些测试是可重复的。在这种情况下,您需要一个可以 播种 的确定性 PRNG。urandom
另一方面不能播种并且从许多不可预测的来源中提取熵源,使其 _更加随机_。真正 的随机性是另一回事,你需要一个随机性的物理来源,比如测量原子衰变的东西;这在物理意义上是真正随机的,但对于大多数应用程序来说通常是矫枉过正的。