Hash 删除字节时的SHA冲突概率

Hash 删除字节时的SHA冲突概率,hash,cryptography,sha,Hash,Cryptography,Sha,我正在实现一个使用可变长度id的程序。这些id标识一条消息,并发送给代理,代理将执行一些操作(与问题无关)。但是,代理中此id的最大长度为24字节。我在考虑用SHA散列id(在发送到代理之前),并删除一些字节,直到它只得到24个字节 然而,我想知道这会增加多少碰撞。这就是我到目前为止得到的: 我发现对于“完美”散列,我们有公式p^2/2^n+1来描述碰撞的概率,其中p是消息的数量,n是消息的大小(以位为单位)。我的问题就从这里开始。我假设从最后的散列中删除一些字节,函数仍然是“完美的”,我仍然可

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

然而,我想知道这会增加多少碰撞。这就是我到目前为止得到的:

我发现对于“完美”散列,我们有公式
p^2/2^n+1
来描述碰撞的概率,其中
p
是消息的数量,
n
是消息的大小(以位为单位)。我的问题就从这里开始。我假设从最后的散列中删除一些字节,函数仍然是“完美的”,我仍然可以使用相同的公式。假设我得到:

 5160^2 / 2^192 + 1 = 2.12x10^-51
其中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个哈希函数调用才能找到一个冲突。这是目前不可行的,即使是非常强大的攻击者,基本上是不可能的意外碰撞

但是,代理中此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个哈希函数调用才能找到一个冲突。这是目前不可行的,即使是对非常强大的攻击者,基本上是不可能的意外碰撞。

完美的人。谢谢。事实上,我忘了提到我也被限制在字母数字字符,所以我需要对它进行hexa消化。但不管怎样,你的回答告诉了我所有我想知道的事情。非常感谢。如果您被限制为24个十六进制字符,则不能假定为192位哈希函数,而只能假定为96位哈希函数,这是一个非常小的函数。考虑使用Base64或者至少是Base32。是的,这是真的。我忽略了将其转储到hex将使其在截断为24个字符时变得更小。好的,我会重新考虑这个策略并考虑Base64。无论如何,谢谢你对散列的帮助。从散列中获取第一个(索引最低的,最左边的)字节似乎是行业标准,所以我建议遵循它。完美男人。谢谢。事实上,我忘了提到我也被限制在字母数字字符,所以我需要对它进行hexa消化。但不管怎样,你的回答告诉了我所有我想知道的事情。非常感谢。如果您被限制为24个十六进制字符,则不能假定为192位哈希函数,而只能假定为96位哈希函数,这是一个非常小的函数。考虑使用Base64或者至少是Base32。是的,这是真的。我忽略了将其转储到hex将使其在截断为24个字符时变得更小。好的,我会重新考虑这个策略并考虑Base64。无论如何,感谢您对散列的帮助。从散列中获取第一个(索引最低的,最左边的)字节似乎是行业标准,因此我建议遵循它。