如果在每次使用之前播种高熵种子,Python的3个random.random是否足够安全?

时间:2017-12-12 12:50:43

标签: python-3.x security random

如果在每次使用之前播种高熵种子,Python的3个random.random()是否足够安全?除了验证分布形状之外,如何知道和验证。

所以问题是使用random.random将一些熵源转换为数组项内的许多选择。

比方说,我们有一个9k字的字典,想要随机选择18个字。我们不希望任何其他人通过玩pythons的random.random()来找到它们。

dic = ["word1", "word2", ... , "word19k"]
while(true):
  seed = os.urandom(50)
  random.seed(seed)
  print(random.choice(dic))

2 个答案:

答案 0 :(得分:2)

Python documentation of random specifies

  

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

正如问题的评论中所述,生成随机数的更好,更安全的方法(用于加密目的)是os.urandom()。

来自链接问题的示例代码

>>> import os
>>> os.urandom(10)
'm\xd4\x94\x00x7\xbe\x04\xa2R'
>>> type(os.urandom(10))
<type 'str'>
>>> map(ord, os.urandom(10))
[65, 120, 218, 135, 66, 134, 141, 140, 178, 25]

答案 1 :(得分:1)

好的,在其他地方询问之后,如果随机发生器产生均匀分布,整个操作都没用,但不会带来安全风险。

在问题中,如果随机生成器为每一代播种新种子。这就像应用简单无用的转换x =&gt; F(X)。

如果你使用高熵并通过python random.random ou random.choice传递给这个问题的回答很简单,它和种子质量一样安全。我不建议将其更改为正在运行的系统的高优先级更改。

响应的另一部分是:不要那样做,它没用。使用更好的方法来保护选择而不是random.choice。