繁体   English   中英

什么是os.urandom()和随机的区别?

[英]Whats the difference between os.urandom() and random?

在随机模块python 页面(Link Here)上有这个警告:

警告:不应将此模块的伪随机生成器用于安全目的。 如果需要加密安全的伪随机数生成器,请使用os.urandom()或SystemRandom。

  • 那么os.urandom()和随机的区别是什么?

  • 一个比一个更接近真正的随机吗?

  • 在非加密实例中,安全随机是否会过度杀伤?

  • python中还有其他随机模块吗?

您可以在Crypto.SE的这个梦幻般的答案中阅读加密安全RNG的区别。

random和系统RNG(如urandom )之间的主要区别是用例之一。 random实现确定性PRNG。 在某些情况下,您确实需要这些。 例如,当您有一个想要测试的随机元素的算法时,您需要这些测试是可重复的。 在这种情况下,您需要一个可以播种的确定性PRNG。

另一方面, urandom不能播种,并从许多不可预测的来源中获取其熵源,使其更随机

真正的随机性还有其他东西,你需要一个物理来源的随机性,就像测量原子衰变的东西一样; 这在物理意义上是真正随机的,但对于大多数应用来说通常都是过度杀伤力。

那么os.urandom()和随机的区别是什么?

随机本身是可预测的。 这意味着给定相同的种子,随机生成的数字序列是相同的。 请查看此问题以获得更好的解释。 这个问题也说明比随机不是真正随机的。

对于大多数编程语言来说通常就是这种情况 - 随机数的生成并不是真正随机的。 如果不考虑加密安全性,或者您希望生成相同的数字模式,则可以使用这些数字。

一个比一个更接近真正的随机吗?

不知道如何回答这个问题,因为无法生成真正的随机数。 有关更多信息,请查看本文此问题

由于随机生成一个可重复的模式,我会说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引入了新的秘密模块

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM