Fre*_*red 3 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
Run Code Online (Sandbox Code Playgroud)
其中 5160 是消息的选择数,192 基本上是 24 字节中的位数。
我的问题:
我的假设正确吗?通过删除一些字节,哈希是否保持“完美”。
如果是这样,并且由于概率非常小,我应该删除哪些字节?最重要还是最不重要?这真的很重要吗?
PS:欢迎任何其他建议来达到相同的结果。谢谢。
但是,代理中此 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 次哈希函数调用才能找到一次冲突。目前这是不可行的,即使对于极其强大的攻击者来说也是如此,并且基本上不可能发生意外碰撞。