当你在浏览器地址栏看到 HTTPS 的锁头图标、在 Git 仓库看到那串 40 个字符的 commit hash、或在下载页面看到「SHA-256 checksum」——这些背后都有 SHA 家族的身影。SHA(Secure Hash Algorithm)是目前最主流的密码哈希标准,但它不是一个算法,而是一个算法家族。理解各版本的差异,是每位开发者必备的基础知识。
1. SHA 的由来
SHA 由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布为联邦信息处理标准(FIPS)。它的发展历程如下:
- 1993 年:SHA-0 发布,但因设计缺陷迅速撤回
- 1995 年:SHA-1 发布,修正 SHA-0 的问题,输出 160 位
- 2001 年:SHA-2 家族发布(SHA-256、SHA-512 等)
- 2015 年:SHA-3(Keccak)正式成为 FIPS 202 标准,作为 SHA-2 的替代方案
和 MD5 一样,SHA 是单向哈希函数,不是加密算法。无法从 SHA 哈希值反推原始数据,也没有「解密」这个概念。
2. SHA-1:已走入历史
SHA-1 曾是网络安全的基石,广泛用于 SSL/TLS 证书、代码签名与版本控制系统。它将任意长度的数据转换成 160 位(40 个十六进制字符)的摘要。
2.1 为什么 SHA-1 已不安全?
2017 年,Google 与 CWI 阿姆斯特丹研究院联合公布了「SHAttered」攻击:他们成功制造出两份内容不同、但 SHA-1 完全相同的 PDF 文件。这是密码学史上第一个实际可行的 SHA-1 碰撞攻击,计算量约需 6,500 CPU 年或 110 GPU 年。
此后,主要浏览器、CA(证书授权机构)和 Git 都宣布弃用 SHA-1。GitHub 在 2023 年完全迁移至 SHA-256。
3. SHA-2 家族:现代标准
SHA-2 是一个算法家族,包含六个成员,以输出长度命名:
| 名称 | 输出长度 | 内部状态 | 主要用途 |
|---|---|---|---|
| SHA-224 | 224 bit | 256 bit | SHA-256 的截断版,较少使用 |
| SHA-256 | 256 bit | 256 bit | TLS、代码签名、Bitcoin、一般安全用途 |
| SHA-384 | 384 bit | 512 bit | SHA-512 的截断版,TLS 1.2 套件 |
| SHA-512 | 512 bit | 512 bit | 高安全性需求、64 位平台性能更佳 |
| SHA-512/224 | 224 bit | 512 bit | 需要 224 位输出但使用 64 位运算 |
| SHA-512/256 | 256 bit | 512 bit | 在 64 位平台比 SHA-256 更快 |
3.1 SHA-256 为何最普及?
SHA-256 是目前使用最广泛的 SHA-2 成员,原因如下:
- 安全边际充足:256 位输出对暴力破解提供 128 位的安全边际
- 硬件加速支持:现代 x86 与 ARM 均有 SHA-256 硬件指令
- 广泛的生态系支持:所有主流语言标准库、TLS 套件均支持
- 32 位友好:SHA-256 基于 32 位运算,在 32 位平台比 SHA-512 更快
3.2 SHA-2 的设计原理
SHA-2 采用 Merkle–Damgård 结构:将消息分成固定大小的块(SHA-256 为 512 位),依序通过压缩函数处理,最终输出哈希值。这也导致 SHA-256 存在长度延伸攻击的潜在风险,但 HMAC-SHA256 可以规避这个问题。
4. SHA-3:全新的设计哲学
SHA-3 并非 SHA-2 的改版,而是采用完全不同架构的新算法。它的前身是 Keccak,在 2012 年 NIST 的公开竞赛中脱颖而出,采用「海绵结构」,天生免疫长度延伸攻击。
4.1 SHA-3 的成员
- SHA3-224、SHA3-256、SHA3-384、SHA3-512:固定输出长度
- SHAKE128、SHAKE256:可扩展输出函数(XOF),输出长度可任意指定
5. SHA 家族完整比较
| 算法 | 输出长度 | 安全性 | 速度(软件) | 推荐场景 |
|---|---|---|---|---|
| SHA-1 | 160 bit | 已破解(SHAttered 2017) | 快 | 不建议新系统使用 |
| SHA-256 | 256 bit | 安全(目前无已知碰撞) | 中等(有硬件加速) | TLS、证书、代码签名、一般用途 |
| SHA-512 | 512 bit | 安全(更高边际) | 在 64 位平台快于 SHA-256 | 高安全性需求、64 位系统 |
| SHA3-256 | 256 bit | 安全(不同设计) | 较慢(硬件加速较少) | 需要设计多样性、抵抗长度延伸攻击 |
6. 场景选择指南
6.1 ✅ TLS/HTTPS 证书 → SHA-256
所有现代 TLS 证书均使用 SHA-256 签名。绝对不使用 SHA-1(浏览器会显示警告或拒绝)。
6.2 ✅ 代码签名与软件发布 → SHA-256
Windows Authenticode、macOS 代码签名、APK 签名均使用 SHA-256。发布软件时应提供 SHA-256 校验码让用户验证。
6.3 ❌ 密码存储 → 不要用任何 SHA
SHA 速度太快,不适合密码存储。请使用 bcrypt、Argon2 或 scrypt——它们的慢速特性才能有效抵抗暴力破解。
6.4 ✅ 消息认证码(MAC)→ HMAC-SHA256
若要对 SHA-256 加上密钥验证(防止伪造),应使用 HMAC-SHA256 而非裸 SHA-256,以防范长度延伸攻击。
7. 计算示例
# 命令行(Linux/macOS)
sha256sum file.txt # Linux
shasum -a 256 file.txt # macOS
sha512sum file.txt # SHA-512
# PHP
hash('sha256', 'hello')
hash('sha512', 'hello')
# Python
import hashlib
hashlib.sha256(b'hello').hexdigest()
hashlib.sha3_256(b'hello').hexdigest() # SHA-3
# JavaScript(Node.js)
const crypto = require('crypto')
crypto.createHash('sha256').update('hello').digest('hex')
8. 小结
SHA 家族从 SHA-1 到 SHA-3 的演进,反映了密码学研究的持续进步:SHA-1 已因碰撞攻击走入历史;SHA-256 是现代安全基础设施的核心;SHA-512 在高安全需求或 64 位平台有其优势;SHA-3 以全新的海绵结构提供了设计多样性。掌握这些差异,能让你在系统设计和技术选型时做出更准确的判断。