你能截断一个SHA1哈希值多少,并合理地确定有一个唯一的ID?

问题描述 投票:19回答:5

我正在做一个存储文档的应用程序,并根据包括时间戳在内的一些东西的SHA1摘要给每个文档一个UID。该摘要有很多字符,我想让用户通过使用完整摘要的前x个字符来识别文档。如果文档的数量大概在10K-100K之间,那么x的值是多少呢?

algorithm probability sha1 hmac
5个回答
22
投票

适应上的公式 维基百科上的生日问题,你可以将碰撞的概率近似为 1 - e^(-n^2/(2^(b+1))),其中 n 是指文件数量和 b 是位数。在n=100,000的情况下,将此公式绘制成图。貌似你会想要b > 45至少。我更倾向于用64来使它成为一个漂亮的整数。话说回来,如果发生碰撞,你是否有一个处理计划(也许稍微改变一下时间戳,或者添加一个nonce?

对于这个问题,如果sha1不仅仅是基于文档的内容,为什么不干脆让它成为一个随机的ID呢?在这种情况下,碰撞的问题就不那么严重了,因为你可以随时生成一个新的随机数,然后再试一次(不过,一次尝试的碰撞概率是一样的)。


2
投票

这真的没有一个值;SHA之所以成为一个很好的通用散列算法,部分原因是相似的数据不一定会产生相似的散列值。你最好的选择(在不了解你的系统的情况下)只是搜索哈希值以用户提供的值开始的文档列表,然后给他们提供一个文档列表供他们选择,或者直接进入文档(如果只有一个)。


2
投票

要注意截断,因为没有减少证明较小的哈希是安全的。请看Kelsey的 http:/csrc.nist.govgroupsSThashdocumentsKelsey_Truncation.pdf。. Kelsey给到启发式论证说明了同样的问题("相关哈希输出 "和 "近碰撞")。BihamChen提供了近似碰撞的例子;Knudsen则演示了截断差分。

最后,你可能想将你的数据输入到HMAC 截断的大小(大小也被HMAC消化了),然后使用截断的HMAC。


1
投票

这是一个 泛化生日问题. 在你的情况下 n 是文件的数量,而不是常数365,你会有切断给你的可能性的数量(所以对于k位是2k).

当然精确计算是不可能的,但你可以用 近似.


0
投票

好吧,这里有一个可能过于简单的答案... ...

如果用全Sha1,你得到大约1/2^160的碰撞机会,那么通过截断一个字符,你增加了16个碰撞的机会(截断字符的所有可能值)......也就是2^4。所以,如果你截断x个字符,你就会得到2^(160 - 4*x)的1次碰撞机会,对吗?

© www.soinside.com 2019 - 2024. All rights reserved.