【问题标题】:Random number generation in pythonpython中的随机数生成
【发布时间】:2018-10-12 08:05:25
【问题描述】:

这是生成n 加密随机字节的有效方法吗?

def cryptographically_secure_random_bytes(n):
    return ''.join(chr(random.SystemRandom().randint(0,256)) for _ in range(n))

我知道random.SystemRandom()os.urandom() 相同,而且我知道os.urandom() 绝对是一种生成随机数的密码安全方式。

但是,chr(random.SystemRandom().randint(0,256)) 部分让我有点失望。由于chr() 不支持unicode,我假设这个函数正在丢弃一些原本由random.SystemRandom() 生成的字符。

我也不确定randint(0,256) 会怎么想,因为那是一个字节的大小。

【问题讨论】:

  • 我认为 randint 的上限是包容性的。因此,如果返回 256,从技术上讲,您的 randint 可能超过一个字节。

标签: python random cryptography


【解决方案1】:

random.randint(a, b)

返回一个随机整数 N,使得 a

所以它是包容性的,你可以得到比一个字节更大的东西。

【讨论】:

  • 换句话说,答案是:NO!
【解决方案2】:

使用secret 模块!

来自文档:

secrets 模块用于生成加密强随机数,适用于管理密码、帐户身份验证、安全令牌和相关机密等数据。

特别是,secrets 应优先于 random 模块中的默认伪随机数生成器使用,该生成器是为建模和仿真而设计的,而不是安全或密码学。

【讨论】:

  • 如果我正在编写这段代码,我当然会使用它,但是,这个问题与不属于我的代码有关。
  • 另外,SystemRandom 不是 random 模块中的默认 PRNG。
猜你喜欢
  • 2021-08-14
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多