删除字节时的SHA冲突概率

时间:2012-09-17 08:46:53

标签: hash cryptography sha

我正在实现一些使用可变长度的id的程序。这些id识别消息并发送给代理,代理将执行某些操作(与问题无关)。但是,代理中此id的最大长度为24个字节。我正在考虑用SHA散列id(在发送到代理之前)并删除一些字节,直到它只有24个字节。

但是,我想知道这会增加多少碰撞。所以这就是我现在所得到的:

我发现对于“完美”哈希,我们使用公式p^2 / 2^n+1来描述冲突的概率,其中p是消息的数量,n的大小是 5160^2 / 2^192 + 1 = 2.12x10^-51 比特中的消息。这是我的问题开始的地方。我假设从最终散列中删除一些字节,该函数仍然是“完美的”,我仍然可以使用相同的公式。所以假设我得到:

{{1}}

其中5160是消息的选择号,192基本上是24字节的位数。

我的问题:

  • 我的假设是否正确?通过删除一些字节,散列是否保持“完美”。

  • 如果是这样,既然概率很小,我应该删除哪些字节?大多数或不太重要?这真的很重要吗?

PS:欢迎任何其他建议达到相同的结果。感谢。

1 个答案:

答案 0 :(得分:4)

  

但是,代理中此id的最大长度为24个字节。我正在考虑用SHA散列id(在发送到代理之前)并删除一些字节,直到它只有24个字节。

SHA-1仅输出20个字节(160位),因此您需要填充它。至少如果所有字节都有效,并且您不限于十六进制或Base64。我建议使用截断的SHA-2。

  

我的假设是否正确?通过删除一些字节,散列是否保持“完美”。

差不多。截断散列应该保留所有重要属性,显然是在较小的输出大小对应的安全级别降低。

  

如果是这样,既然概率很小,我应该删除哪些字节?大多数或不太重要?这真的很重要吗?

这根本不重要。 NIST定义了一个截断的SHA-2变体,称为SHA-224,它使用不同的初始状态来获取SHA-256的前28个字节进行哈希计算。


我的建议是使用SHA-256,保留前24个字节。这需要大约2 ^ 96个哈希函数调用来查找一个冲突。目前这是不可行的,即使对于极其强大的攻击者来说也是如此,并且基本上不可能发生意外碰撞。