hash - 对于小字符串哈希,我应该使用 MD5 等已弃用的算法还是 SHA256 等算法的前缀吗?

标签 hash cryptography

我有 16 个字节来保存字符串哈希。我知道当您将任意长度的字符串减少为固定长度的字节序列时,冲突是不可避免的,但我想尽可能避免它们。我是否最好使用输出为 16 字节的 MD5 等已弃用的算法,或者使用 SHA-256 等尚未被破解的算法的前 16 字节?

最佳答案

鉴于 NIST 将 SHA-224 定义为截断的 SHA-256,这就是官方的“批准印章”,因为您可能会遇到“截断 SHA-256 以适应大小是不是一个好主意”的问题要求?”。

由于 MD5 已被彻底废除,并且很快将与 MD4 一起列入“即使用于内部测试”的架子上,答案非常明确 - 使用截断的 SHA-256。

话虽这么说,当你减少它时 - 碰撞次数自然会增加。 SHA-256 在统计上分布良好,因此缩短不会比仅使用 128 位不可避免地增加冲突更多(嗯,多一点,因为没有哈希是完美的)。缩短甚至会带来额外的好处,即增强 SHA-256 对长度扩展攻击的抵抗力。

我知道业内有很多系统使用减半的 SHA-512 来增强对 LAE 的抵抗力(好吧,目前是理论上的)而不是 SHA-256 - 额外的好处是 64 位系统上的性能提升计算 SHA-512 与 SHA-256。

我遇到的最常见的截断形式是将前半部分与后半部分进行异或。我不确定它是否提供任何额外的好处,但当人们看到“截断器”的“无法识别”的输出时,他们会感到更放心,所以他们就会接受它。

更新

根据 deceze 的建议 - 当哈希值被限定为“即使用于内部测试也不要使用”时,这意味着它在其设计目的上做得很糟糕,并且应该不惜一切代价避免该特定情况应用程序,但不一定适用于其他应用程序。

MD4 和 MD5 都可以在非加密设置中用作可靠的哈希算法,而且我见过系统专门为此重新利用 MD4 - 它非常快,具有可靠的传播范围,如果您不太挑剔的话与冲突(假设您正在构建一个备份程序,需要知道自上次备份以来哪些文件发生了更改),它可以与为这些特定目的设计的一些非加密哈希进行正面交锋。

但是,通常情况下,最好使用正确的工具来完成工作。非加密哈希的设计首先是为了速度,但也是为了传播和低冲突率,其中一些哈希甚至比加密哈希的配置文件更出色,唯一的缺点是或多或少可预测。

如果您需要非加密哈希,而不是诉诸损坏的加密哈希,我建议您查看一些用于非加密目的的整体更好的哈希,例如 FNV-1/FNV-1aMurmur 甚至普通的 CRC32 (a有点慢,但比大多数加密哈希快)。有一个 really great comparison on speed, spread and collisions on SE,所以一定要检查一下。

关于hash - 对于小字符串哈希,我应该使用 MD5 等已弃用的算法还是 SHA256 等算法的前缀吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44170851/

相关文章:

JavaScript 中的 PHP 函数 crypt()

.net - 安全密码哈希

php哈希形式字符串到整数

php - Swift SHA256 哈希与 PHP SHA256 哈希不匹配

c# - 对于支持 FIPS 的系统,是否有替代 MD5 的哈希算法?

java - 在 Android 中实现 AES 加密

ios - xcode ios HMAC SHA 256哈希

c# - WinRT/Metro 中的增量哈希

python - 无法在 python 3.5(pip、ubuntu 3.5)上安装 'secrets'

c++ - std::unordered_map 是如何存储和比较其键值以实现无序快速访问元素的?