# SHA-1（安全哈希算法 1）是什么？定义、例子与常见误区

> SHA-1 是 1995 年发布的 160 位哈希函数，已出现实际可行的碰撞攻击，公开信任的 TLS 证书早已不再允许使用它签名。

Source: https://ssl.sh/zh/glossary/sha-1/
Last updated: 2026-11-10

SHA-1 是由 NSA 设计、NIST 于 1995 年在 FIPS 180-1 中发布的[哈希函数](https://ssl.sh/zh/glossary/hash-function/)，输出 160 位摘要。2005 年起就有理论攻击公开发表；2017 年 2 月，Google 与荷兰 CWI 的研究人员公布了 SHAttered，这是第一个公开的 SHA-1 碰撞实例：两个内容不同的 PDF 文件摘要完全相同。2020 年又出现了选择前缀碰撞，这类攻击让伪造证书等签名对象变得现实可行。

## 为什么重要
证书签名签的是证书内容的哈希，哈希被攻破，签名也就失去意义。CA/浏览器论坛的 [Baseline Requirements](https://ssl.sh/zh/glossary/baseline-requirements/) 规定自 2016 年 1 月 1 日起停止签发 SHA-1 签名的 TLS 证书，主流浏览器在 2017 年初也不再接受 SHA-1 签名的 TLS 证书。如今证书都使用 [SHA-256](https://ssl.sh/zh/glossary/sha-256/) 或 SHA-384 签名。SHA-1 仍会出现在一些无害的地方，比如工具显示的证书指纹、旧密码套件中的 HMAC-SHA1。国内一些老旧内网系统和设备自带的证书可能仍是 SHA-1 签名，迁移时值得留意。

## 例子
查看证书签名使用的哈希；叶子证书或中间证书出现 `sha1WithRSAEncryption` 就要警惕：

```bash
openssl x509 -in example.com.crt -noout -text | grep 'Signature Algorithm'
openssl x509 -in example.com.crt -noout -fingerprint -sha1
```

第二条命令只是在本地计算 SHA-1 指纹，与证书用什么算法签名无关。

## 常见误区
- **显示了 SHA-1 指纹，说明证书用的是 SHA-1。** 指纹由查看者自行选择哈希算法计算，和证书的签名算法毫无关系。
- **以 -SHA 结尾的套件因 SHA-1 被攻破而不安全。** 这些套件用的是 HMAC-SHA1，并不依赖抗碰撞性，淘汰它们的理由是 CBC 模式和缺少 AEAD。
- **用 SHA-1 自签名的根证书必须更换。** 根证书之所以可信，是因为它在信任库里，而不是靠自签名；真正要紧的是中间证书和叶子证书上的签名。

## 相关术语

- [哈希函数](https://ssl.sh/zh/glossary/hash-function/): 哈希函数（密码学哈希函数）把任意长度的输入映射为固定长度的摘要，且在计算上无法逆推输入，也无法找到摘要相同的两个输入。
- [SHA-256](https://ssl.sh/zh/glossary/sha-256/): SHA-256 是 SHA-2 哈希家族中输出 256 位摘要的成员，由 NIST FIPS 180-4 规定，是当今 TLS 证书签名和指纹的标准哈希算法。
- [数字签名](https://ssl.sh/zh/glossary/digital-signature/): 数字签名是用私钥对消息计算出的一个值，任何持有对应公钥的人都能验证它，从而确认消息来源和内容未被篡改。
- [证书指纹](https://ssl.sh/zh/glossary/certificate-fingerprint/): 证书指纹是对证书 DER 编码计算出的哈希值（通常用 SHA-256），用来唯一标识一张证书，它本身并不存储在证书里。
- [Baseline Requirements](https://ssl.sh/zh/glossary/baseline-requirements/): Baseline Requirements 是 CA/B 论坛制定的基线要求，规定公开信任的 CA 在验证、签发和吊销 TLS 服务器证书时必须遵守的规则。
- [根证书](https://ssl.sh/zh/glossary/root-certificate/): 根证书是位于证书链顶端、由 CA 自签名的证书，预装在操作系统或浏览器的信任库中，作为验证其他证书的信任锚。
