我有16个字节来保存字符串哈希.我理解当你将任意长度的字符串减少到固定长度的字节序列时,碰撞是生活中的事实,但我想尽可能地避免它们.我最好使用一个不推荐使用的算法,如MD5,输出为16字节,或者是尚未破解的算法的前16个字节,如SHA-256?
鉴于NIST将SHA-224定义为截断的SHA-256,这是正式的"批准印章",因为您将要解决的问题是"将SHA-256截断以适应大小要求是一个好主意吗?" .
而且由于MD5完全被拆除并很快加入MD4的"不要使用甚至用于内部测试"架子,答案很清楚 - 使用截断的SHA-256.
话虽这么说,你减少它的那一刻 - 碰撞的数量自然会增加.SHA-256在统计上得到了很好的传播,因此缩短不应该比仅仅128位不可避免地增加冲突(嗯,因为没有散列是完美的,所以更多).缩短甚至可以增加已经稳固的SHA-256对长度延伸攻击的抵抗力.
我知道业界有很多系统使用减半的SHA-512来增加对LAE的抵抗力(当时理论上)而不是SHA-256 - 另外一个好处就是在计算SHA时64位系统的性能提升-512对比SHA-256.
我遇到的最常见的截断形式是在下半场对上半场进行异或.我不确定它是否提供任何额外的好处,但是当他们看到"截断器"的'无法识别'输出时,人们会感到更放心,所以他们只是随意使用它.
UPDATE
根据deceze的建议 - 当哈希被认定为"不使用甚至用于内部测试"时,这意味着它对于它的设计要做的工作做得不好,应该不惜一切代价避免该特定应用但不能必须用于其他应用.
MD4和MD5都可以用作非加密设置中的实体哈希算法,我已经看到系统专门为此重新设计MD4 - 它非常快,具有可靠的扩展,如果你不是太挑剔的碰撞(假设您正在构建一个需要知道自上次备份后哪些文件发生了变化的备份程序,它可以与为某些特定目的设计的一些非加密哈希直接对接.
但是,通常情况下,最好使用正确的工具来完成工作.非加密哈希首先设计用于速度,但也用于传播和低冲突率,并且其中一些哈希甚至优于加密哈希,其轮廓仅具有或多或少可预测的缺点.
如果你需要一个非加密的哈希,而不是诉诸破碎的加密哈希,我建议你看一下非加密目的的一些整体更好的哈希,如FNV-1/FNV-1a,Murmur甚至普通CRC32(有点慢,但比大多数加密哈希更快).对SE的速度,传播和碰撞进行了非常好的比较,所以一定要检查一下.
| 归档时间: |
|
| 查看次数: |
391 次 |
| 最近记录: |