测试:所有电话号码的sha1,sha256中的冲突

时间:2014-02-07 15:00:22

标签: python

我需要知道在散列国内(10位数)和国际(15位)电话号码时是否会发生生日碰撞。

“不应该”!=不会有

我以为我会使用redis SADD response = 0快速运行一些python到空间中的每个n来告诉我是否发生了碰撞。

现在一个10 ^ n的空间似乎很小,但是当你映射成对比较时,我们处于O(10 ^ n)空间,这是一个计算不好的地方。

  1. 我需要一个完美的哈希吗?我希望这些电话号码不可恢复,所以SHA256有优点,但值^ 2 +值+盐或一些这样的可能没问题。在合理范围内,我不关心场的长度。我会加入...但

  2. 任何人都知道特定哈希的连续数字组中没有碰撞的证据吗?不是碰撞的概率,而是证据。

  3. 非常感谢!

    编辑反映它小于n!确实是(10 ^ n)(10 ^ n-1)/ 2所以O(10 ^ n)谢谢DSM

2 个答案:

答案 0 :(得分:2)

如果您想要的是每个电话号码都有一个唯一的密钥,您可以简单地使用AES等对称密码术。使用电话号码作为密钥,这可以保证其他电话号码不会产生相同的密码。

生成:“原始文本”----用key = phone_number加密----> “9安培; &安培; Y (&安培; GG(的O& GG(B)H)* H”

验证:“9& & Y (& GG(O& GG(B)H)* H”----用key = phone_number解密---->“原文“

答案 1 :(得分:2)

你预计人们会告诉你"可能"不会发生碰撞,但仍然值得澄清这意味着什么。找到重复SHA2的几率非常低,太阳光或制造缺陷更有可能在CPU中随机翻转。你的程序总是很有可能会疯狂,因此编写围绕概率的代码并不是真的有意义。

你可能会说恶意输入可能会使其更容易发生碰撞。但截至2015年3月,任何输入都没有发现SHA1或SHA2的冲突,当发现任何输入时,这将是一个重大新闻。

@tk。建议使用AES很聪明,所以如果这对你有用,那就很好。但是如果你遇到问题 - 例如,如果你发现自己的密钥长度超过32字节 - 那么回到SHA2就没有错。