【问题标题】:How much can you truncate a SHA1 hash and be reasonably sure of having an unique ID?您可以截断多少 SHA1 哈希并合理确定拥有唯一 ID?
【发布时间】:2011-06-14 15:15:16
【问题描述】:

我正在制作一个存储文档的应用程序,并根据包括时间戳在内的一些内容的 SHA1 摘要为每个文档提供一个 UID。摘要有很多字符,我想让用户通过使用完整摘要的前 x 个字符来识别文档。如果文档数量可能在 10K - 100K 左右,那么 x 有什么好的价值?

【问题讨论】:

    标签: algorithm probability sha1 hmac


    【解决方案1】:

    调整wikipedia for the Birthday problem 上的公式,您可以将碰撞概率近似为1 - e^(-n^2/(2^(b+1))),其中n 是文档数,b 是位数。 Graphing this formula with n=100,000,看起来您至少需要 b > 45。我更倾向于使用 64 以使其成为一个不错的整数。也就是说,如果发生冲突,是否有处理冲突的计划(可能稍微改变时间戳,或者添加一个随机数?)

    就此而言,如果 sha1 不仅仅基于文档的内容,为什么不简单地将其设为随机 ID?在这种情况下,冲突问题不大,因为您始终可以生成一个新的随机数并重试(不过,一次尝试的冲突概率是相同的)。

    【讨论】:

    • 小笨蛋 - 公式不是 e^(-n^2/(2^(b+1))) 吗?它将答案略微更改为 b >40。
    • @Fakrudeen,确实 - 我在将其转录为答案时出错了。该图是正确的......虽然我刚刚意识到stackoverflow没有为它建立链接:|
    • 我已经更新了答案,以获得 cmets 中商定的正确公式。
    • Biham/Chen 提供了近乎碰撞的例子; Knudsen 演示了截断微分。两者都是截断哈希的问题;生日悖论的例子也不是。
    • Marc Stevens 在 MD5 和 SHA 上是 engineering prefix collisions。他正在做一些事情来导致预期分布的崩溃:) 所以它可能不足以简单地截断并期望较小的散列具有与减小的位大小等效的安全性。
    【解决方案2】:

    注意截断,因为较小的哈希是安全的证据并没有减少。请参阅 Kelsey 的 http://csrc.nist.gov/groups/ST/hash/documents/Kelsey_Truncation.pdf。 Kelsey 给出了相同的启发式参数(“相关哈希输出”和“接近碰撞”)。 Biham/Chen 提供了近乎碰撞的例子; Knudsen 演示了截断微分。

    最后,您可能希望将数据输入到 HMAC with 被截断的大小(大小也被 HMAC 消化),然后使用被截断的 HMAC。

    【讨论】:

    • 您好 JWW,关于 NIST-PDF,您如何解释它? @bdonlan 的公式e^(-n^2/(2^(b+1))) 是估计截断的一个很好的近似值吗?如果不是,检查 最小位数 (bmin) 的 SHA1 截断的公式或算法是什么?
    【解决方案3】:

    这确实没有价值;使 SHA 成为良好的通用散列算法的部分原因是相似的数据不一定会产生相似的散列值。您最好的选择(不了解您的系统的任何其他信息)只是搜索其哈希以用户提供的值开头的文档列表,然后向他们提供要从中选择的文档列表或直接转到文档如果只有一个。

    【讨论】:

    • 这就是 git 对 revs 的作用吗?
    【解决方案4】:

    这是the birthday problem 中的generalization。在您的情况下,n 是文档的数量,而不是恒定的 365,您将有多种可能性,截止日期为您提供(因此对于 k 位,它是 2k)。

    当然精确计算是不可能的,但你可以使用approximation

    【讨论】:

    • Biham/Chen 提供了近乎碰撞的例子; Knudsen 演示了截断微分。两者都是截断哈希的问题;生日悖论的例子也不是。
    【解决方案5】:

    嗯,这可能是一个过于简单的答案..

    如果使用完整的 sha1,您将获得大约 2^160 分之一的碰撞机会,那么通过截断一个字符,您可以将碰撞机会增加 16(截断字符的所有可能值)......这是 2^4。 . 所以,如果你截断 x 个字符,你会得到 1 in 2^(160 - 4*x) 的碰撞机会.. 对吗?

    【讨论】:

    • 对于单个文档,这是正确的,但任何一对文档发生任何冲突的概率增加得更快
    • Biham/Chen 提供了近乎碰撞的例子; Knudsen 演示了截断微分。两者都是截断哈希的问题;生日悖论的例子也不是。
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2011-03-02
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多