术语表

哈希函数 (Hash Function,散列函数,密码学哈希)

最后核实

定义

哈希函数(密码学哈希函数)把任意长度的输入映射为固定长度的摘要,且在计算上无法逆推输入,也无法找到摘要相同的两个输入。

密码学哈希函数接受任意长度的数据,输出固定长度的摘要,例如 SHA-256 输出 256 位。它必须具备抗原像性(给定摘要找不到对应输入)、抗第二原像性和抗碰撞性(找不到两个摘要相同的输入),输入哪怕只改一位,摘要也会面目全非。当前常用的有 SHA-256、SHA-384 和 SHA-3;MD5 和 SHA-1 的抗碰撞性已被攻破。

为什么重要

哈希几乎支撑着 TLS 和 PKI 的每个环节。证书上的数字签名签的其实是证书内容的哈希,一旦哈希可以被实际碰撞,攻击者就可能把 CA 的签名"挪用"到伪造证书上;2008 年研究人员正是利用 MD5 碰撞做出了一张伪造的 CA 证书。此外,证书指纹、HMAC 与 HKDF 密钥派生、Finished 消息对握手记录的校验,以及证书透明度日志的 Merkle 树,都依赖哈希函数。国密体系中的 SM3 也属于这一类算法。

例子

只改一个字符,摘要就完全不同:

printf 'example.com' | openssl dgst -sha256
printf 'example.con' | openssl dgst -sha256
openssl x509 -in example.com.crt -noout -fingerprint -sha256

常见误区

  • 哈希就是一种加密。 哈希没有密钥,也无法解密。保存用户密码应使用 bcrypt、Argon2 这类专门的慢速函数,而不是直接用快速哈希。
  • 指纹对得上,证书就可信。 指纹只用来唯一标识某一张证书,是否可信要靠证书链验证。
  • 输出够长的哈希就够安全。 MD5 有 128 位、SHA-1 有 160 位,但两者都已出现实际碰撞,关键在算法本身而不只是长度。

延伸阅读