我正在实现一些使用可变长度的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:欢迎任何其他建议达到相同的结果。感谢。
答案 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个哈希函数调用来查找一个冲突。目前这是不可行的,即使对于极其强大的攻击者来说也是如此,并且基本上不可能发生意外碰撞。