如果我想保存一定位数的哈希,但我的哈希算法给了我比我需要的更多的位,那么缩短它的最安全方法是什么?
我是不是该:
- 只需删除前几位或后几位
- 将我保留的部分的前几位或后几位异或
- 做点别的
我如何缩短它是否重要,还是取决于我使用的哈希算法?这是否会降低散列的安全性(例如:将 128 位散列修剪为 64 位是否比相同算法的 64 位散列差)?
如果我想保存一定位数的哈希,但我的哈希算法给了我比我需要的更多的位,那么缩短它的最安全方法是什么?
我是不是该:
我如何缩短它是否重要,还是取决于我使用的哈希算法?这是否会降低散列的安全性(例如:将 128 位散列修剪为 64 位是否比相同算法的 64 位散列差)?
简单地截断散列是缩短散列的常用方法。你不需要做任何花哨的事情。
这里和crypto.stackexchange上有很多关于这样做是否会降低哈希强度的问题(请参阅底部的相关问题列表)。答案是不,截断散列并不会降低其强度(除了较短的散列有更多的冲突)。
根据@Reid 在[2] 中的回答和@ThomasPornin 在[3] 中的回答,NIST 完全支持截断哈希的想法,实际上 SHA-224 只是 SHA-256 截断,SHA-384 只是 SHA-512 截断, 等等。
相关问题
[1]消息认证的截断散列?
是的,缩短散列确实会降低散列的安全性。哈希算法安全性的一个重要部分是算法的抗碰撞性。这意味着如果我散列ThingToHash1
结果(希望)不会匹配任何其他输入的散列。通过截断散列,您增加了发生冲突的可能性,因为只有散列算法输出的一个子集需要与另一个输入的输出发生冲突。但是,如果偶尔发生的冲突是可以接受的,并且不会损害您的应用程序的安全性,则可以这样做。例如,git 接受截断的提交哈希来识别特定的提交。