什么更随机,hashlib或urandom?

时间:2012-04-26 20:39:49

标签: python random hash

我正在和朋友一起开展一个项目,我们需要生成一个随机哈希。在我们有时间讨论之前,我们都提出了不同的方法,因为他们使用不同的模块,我想问你所有更好的东西 - 如果有这样的话。

hashlib.sha1(str(random.random())).hexdigest()

os.urandom(16).encode('hex')

输出这个问题让我觉得第二种方法更好。简单比复杂更好。如果您同意,那么“随机”生成哈希值有多可靠?我该如何测试?

5 个答案:

答案 0 :(得分:38)

此解决方案:

os.urandom(16).encode('hex')

是最好的,因为uses the OS生成随机性 可用于加密目的(取决于操作系统实现)。

random.random()生成pseudo-random values

散列随机值不会添加任何新的随机性。

答案 1 :(得分:7)

random.random()是一个伪radmom生成器,这意味着数字是从序列生成的。如果你打电话给random.seed(some_number),那么生成的序列将始终相同。

os.urandom()得到来自os'ng的随机数,它使用熵池来收集真实的随机数,通常是来自硬件设备的随机事件,甚至存在随机特殊熵发生器用于很多系统生成随机数。

在unix系统上传统上有两个随机数生成器:/dev/random/dev/urandom。如果没有足够的熵可用,则调用第一个块,而当您读取/dev/urandom并且没有足够的熵数据可用时,它会使用伪rng并且不会阻塞。

所以使用通常取决于你需要的东西:如果你需要一些均匀分布的随机数,那么内置的prng就足够了。对于加密使用,使用真实的随机数总是更好。

答案 2 :(得分:7)

第二种解决方案显然比第一种解决方案具有更多的熵。假设os.urandomrandom.random的随机位源的质量相同:

  • 在第二个解决方案中,您将获取16个字节= 128位的随机性
  • 在第一个解决方案中,您将获取一个浮点值,该值具有大约52位的随机性(IEEE 754 double,忽略次正规数等等)。然后你把它哈希,当然,这不会增加任何随机性。

更重要的是,来自os.urandom的随机性的质量预计并记录为比来自random.random的随机性好得多。 os.urandom的文档字符串“适合加密使用”。

答案 3 :(得分:2)

测试随机性是非常困难的 - 然而,我会选择第二种方法,但仅限于(或者,只有在我想到的情况下)这种情况,其中散列由随机数种子。

哈希的重点是根据输入的细微差别创建大不相同的数字。对于您的用例,输入的随机性应该如此。但是,如果你想散列一个文件并检测一个eensy字节的差异,那就是哈希算法闪耀的时候。

但是,我只是好奇:为什么要使用哈希算法呢?看起来你正在寻找一个纯随机数,并且有很多库生成uuid,它比独立数生成器具有更强的唯一性保证。

答案 4 :(得分:2)

如果你想要一个唯一标识符(uuid),那么你应该使用

import uuid
uuid.uuid4().hex

https://docs.python.org/3/library/uuid.html