密码学哈希 vs 非密码学哈希:设计哲学的分野

💡 原文中文,约12000字,阅读约需29分钟。
📝

内容提要

本文讨论了哈希函数的设计哲学,区分密码学哈希(如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,支持并行处理,适合文件完整性校验和消息认证等场景。

选择哈希函数时需要考虑哪些因素?

应考虑输入来源的可信性、键的长度、是否需要确定性以及是否需要密码学安全等因素。

➡️

继续阅读