密码学哈希 vs 非密码学哈希:设计哲学的分野
内容提要
本文讨论了哈希函数的设计哲学,区分密码学哈希(如SHA-256,具备抗碰撞性)与非密码学哈希(如MurmurHash和xxHash,注重速度和均匀性)。文章还提到HashDoS攻击及其影响,建议使用安全哈希函数如SipHash来防范此类攻击,并提供选择哈希函数的决策树,强调在处理不可信输入时使用带密钥的哈希函数。
关键要点
-
哈希函数分为密码学哈希和非密码学哈希,前者如SHA-256具备抗碰撞性,后者如MurmurHash注重速度和均匀性。
-
HashDoS攻击通过构造大量哈希碰撞的键名,导致哈希表性能严重下降,影响多种编程语言的哈希实现。
-
密码学哈希函数需满足抗原像性、抗第二原像性和抗碰撞性三大性质,而非密码学哈希则强调速度和输出均匀性。
-
SipHash是一种带密钥的哈希函数,专为哈希表设计,提供伪随机函数安全性,能够有效防范HashDoS攻击。
-
长度扩展攻击利用Merkle-Damgård构造的特性,攻击者可以在不知道原始消息的情况下扩展消息,影响MD5和SHA-1等哈希函数。
-
现代非密码学哈希如wyhash和xxHash3在性能上表现优异,适合高效的哈希表实现。
-
BLAKE3是新一代密码学哈希,结合Merkle树结构,支持并行处理,性能显著优于SHA-256。
-
选择哈希函数时应考虑输入来源的可信性,若来自不可信来源,需使用安全性更高的哈希函数如SipHash。
-
工程实践中应避免使用确定性哈希处理网络输入,使用HMAC进行消息认证,避免使用CRC32作为通用哈希。
延伸问答
密码学哈希和非密码学哈希有什么区别?
密码学哈希如SHA-256具备抗碰撞性,强调安全性;非密码学哈希如MurmurHash则注重速度和均匀性。
什么是HashDoS攻击,它是如何影响哈希表性能的?
HashDoS攻击通过构造大量哈希碰撞的键名,使哈希表性能下降,查找时间从O(1)变为O(n)。
如何防范HashDoS攻击?
可以使用随机化种子、PRF类哈希如SipHash,或在链表长度超过阈值时转换为红黑树来防范。
SipHash的设计目的是什么?
SipHash是一种带密钥的哈希函数,专为哈希表设计,提供伪随机函数安全性,防止HashDoS攻击。
BLAKE3与SHA-256相比有什么优势?
BLAKE3性能显著优于SHA-256,支持并行处理,适合文件完整性校验和消息认证等场景。
选择哈希函数时需要考虑哪些因素?
应考虑输入来源的可信性、键的长度、是否需要确定性以及是否需要密码学安全等因素。