【问题标题】:Are there circumstances where a hash algorithm can be guaranteed unique?是否存在可以保证哈希算法唯一的情况?
【发布时间】:2010-02-22 10:44:49
【问题描述】:

如果我使用比数据(例如 sha-256)更大字节大小的哈希算法对大小受限的类似数据(例如社会安全号码)进行哈希处理,哈希是否能保证相同级别的作为原始数据的唯一性?

【问题讨论】:

    标签: hash unique sha256 hash-code-uniqueness


    【解决方案1】:

    散列冲突的概率与输入字符串的大小无关(除非它表明需要多少个输入来保持唯一性)。当您使用完美的散列算法散列 0 和 1 时,可能会发生散列冲突,尽管可能性是 1/(2^bit-length)。在 SHA-256 的情况下实际上为零。

    哈希冲突是一个生日悖论问题。在 256 位哈希的情况下,两个输入之间发生冲突的概率完全取决于输入的数量,并且是:

    • 1 - (2^256)! / ((2^256^inputcount) * (2^256-inputcount)!) 或正如其他人所说——对于合理数量的输入,基本上为零。

    【讨论】:

    • 是的。不过,我并没有质疑安全隐患。当数据的大小小于散列的大小时,我要求散列的唯一性概率。 (我需要结果值是确定性/可重复的,因此执行 x 字节的随机加盐对我不起作用。我可能会通过在每个实现中添加常量字符来“加盐” - 例如,我可能会附加像 '593jra' 这样的字符到散列之前的ssn)。
    • 生日悖论不是基于鸽巢原理吗?如果是这样,理论上我没有鸽巢场景。
    • 鸽巢原则是一个简单的概念,即当您拥有的物品多于鸽巢时,您肯定会发生碰撞。生日悖论只是说,如果您的物品与分类的比例“高”,那么您真的很可能会发生碰撞。其中“高”由上述公式定义。
    • 我相信您的公式中不需要 1 - 部分 - 除非您试图表达 no 冲突的概率。顺便问一下,你能给我们这个公式的来源吗?
    【解决方案2】:

    您始终可以创建一个确保唯一性的自定义哈希。对于已知域(如 SSN)中的数据,练习相对简单。

    如果您的目标哈希值实际上具有比您正在哈希的更多位,则哈希只是将输入值映射到可用输出值之一。这将是一个简单的线性映射,从作为多字节整数的输入值到作为多字节整数的输出。

    如果您的目标哈希值的位数少于被哈希的位数,则无法保证唯一性。

    【讨论】:

    • 谢谢。我正在考虑散列 ssn 和一个“帐户”标识符,这可能因每个实现而异。因此,如果我可以使用哈希函数而不是预先生成的函数,那就更好了。
    • 如果屏蔽社会安全号码是目标,那么实现一对一的线性映射函数是不够的,因为从输出的一些样本中计算原始输入相当容易。此外,输入字符串的长度肯定不会影响加密安全哈希函数的有效性,因此使用已知的哈希算法是可行的方法
    【解决方案3】:

    其他人指出不应该担心碰撞;这就是密码安全散列函数的全部意义所在。我只想添加以下内容:

    • 如果您的输入集足够小(例如,数据是 SSN - 少于 10 亿个),则可以验证不存在冲突:只需彻底测试即可。
    • 如果输入集太大而无法彻底扫描,则预计不存在冲突无法被证明。良好的散列函数应该充当随机预言机,并且在随机预言机上,如果不进行详尽的尝试,您将无法证明这样的属性。能够证明不存在碰撞可能看起来像是该功能的弱点。

    【讨论】:

      【解决方案4】:

      如果您使用的是像 SHA 这样的加密哈希,那么简短的回答是肯定的。

      【讨论】:

      • 谢谢。我是这么想的,但我找不到支持它的参考资料,而且我不够聪明,无法深入研究数学并得出一种或另一种结论!
      • 如上所述,加密哈希只是说明冲突极不可能,并非不可能。
      • @Novelcrat,short 对原始问题的回答是肯定的。虽然理论上可能发生碰撞,但发现碰撞的平均时间比太阳演化成红巨星并摧毁地球所需的时间要长得多。
      • @Novelcrat。附言如果您可以发布两个产生相同 SHA-256 哈希的 10 位 SSN,我将支付您 1,000 美元。
      • @DieinSente 我找到了他们!付钱给我,我会告诉你的。 :P
      【解决方案5】:

      cryptographically secure hash function 的一个关键特性是,无论输入如何,您都可以安全地避免发生合理怀疑的碰撞。这对于短于输出大小的输入也是有效的,这与熵很小的较长消息相同。因此,您可以使用 SHA-2 而不必担心冲突。

      【讨论】:

        猜你喜欢
        • 2019-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 2011-06-20
        • 2021-12-30
        • 2017-04-09
        相关资源
        最近更新 更多