并非所有哈希都相同

密码学哈希把任意输入映射为固定大小的指纹。存在若干家族,且它们不可互换:有些仍然强健,而有些已被攻破到将其用于安全是一个错误的程度。正确的选择取决于任务和时间,因为二十年前还体面的哈希,今天可能被轻易攻破。

已被攻破的

  • (128 位)已被攻破。碰撞可在笔记本电脑上几秒内产生,并已用于真实攻击(Flame 恶意软件用一次 MD5 碰撞伪造了一张代码签名证书)。它只作为一个快速、无安全性的校验和而存留,即便在那里也有更好的选择。
  • -1(160 位)已被攻破。2017 年的 SHAttered 研究产生了两个具有相同 SHA-1 摘要的不同 ,随后又出现了选择前缀碰撞。浏览器和证书颁发机构多年前已移除对 SHA-1 的支持。不要将其用于对手可攻击的签名或完整性。

当前的主力

  • SHA-2 是大多数工作的默认家族。它是一组相关函数,常见为 SHA-256SHA-512(还有 SHA-224、SHA-384 以及截断的 SHA-512/256)。不存在针对 SHA-2 的实用碰撞攻击。如有疑问,SHA-256 是安全且被普遍支持的选择。
  • SHA-3(Keccak)是一个较新的标准,建立在与 SHA-2 完全不同的内部设计(海绵结构)之上。SHA3-256 与 SHA3-512 提供可比的安全性,并部分作为一种保障而存在:万一在 SHA-2 中发现弱点,SHA-3 不太可能共享它。它在设计上也对困扰 SHA-2 的长度扩展问题免疫。
  • BLAKE2 与 BLAKE3 是现代、极快且安全性强的哈希。尤其 BLAKE3 专为并行化而设计,这使它在你对大量数据进行哈希、又想要速度而不牺牲安全性时颇具吸引力。

选择一个

一份简短的决策指南:

  • 通用完整性、签名或“我只需要一个安全的哈希”:SHA-256
  • 你想要算法多样性,或在不使用 的情况下对长度扩展免疫:SHA-3SHA-512/256
  • 对吞吐量重要的大文件进行哈希:BLAKE3
  • 一个快速、无安全性的校验和(检测意外损坏,而非篡改):CRC 或 MD5 即可,但永远不要称其为“安全”。
  • 密码是另一个问题。 通用哈希对于存储密码而言太快;请使用专门的密码哈希,如 bcrypt、scrypt 或 Argon2(参见密码哈希一文)。

哈希工具 可对文本或文件计算 MD5、SHA-1、SHA-256、SHA-512 及更多,便于你并排比较输出,全部在你的浏览器中,不发送任何内容。