SPY*_*G96 5 python random python-2.7
在随机模块python 页面(链接到此处)上,显示以下警告:
警告:出于安全目的,不应使用此模块的伪随机数生成器。如果需要加密安全的伪随机数生成器,请使用os.urandom()或SystemRandom。
那么os.urandom()和random之间有什么区别?
一个比另一个更接近真正的随机性吗?
在非加密实例中,安全随机是否会过大?
python中还有其他随机模块吗?
dec*_*eze 10
您可以在Crypto.SE上的出色解答中阅读有关加密安全RNG的区别。
random与RNG之类的系统之间的主要区别urandom是用例之一。random实现确定性PRNG。在某些情况下,您需要这些。例如,当您有一个要测试的带有随机元素的算法,并且您需要这些测试是可重复的。在这种情况下,您需要确定的PRNG并可以播种。
urandom另一方面,它不能被播种,而是从许多不可预测的源中获取其熵源,从而使其更加随机。
真正的随机是另外一回事,您需要物理上的随机源,例如可以测量原子衰减的事物。从物理意义上讲,这确实是随机的,但对于大多数应用程序来说通常是过大的。
那么 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)
Run Code Online (Sandbox Code Playgroud)
结果:
0.016040563583374023
0.013456106185913086
Run Code Online (Sandbox Code Playgroud)
python 中还有其他随机模块吗?
Python 3.6引入了新的secrets模块