SHA(安全哈希算法)
Secure Hash Algorithm
SHA(Secure Hash Algorithm,安全哈希算法)是由美国国家安全局(NSA)设计、美国国家标准与技术研究院(NIST)发布的一系列密码学哈希函数。SHA 算法族是当今世界上使用最广泛的密码学哈希函数,支撑着 TLS/SSL、数字签名、区块链、代码签名等关键基础设施的安全。
SHA 算法族经历了多代演进:SHA-0(1993,已弃用)→ SHA-1(1995,已弃用)→ SHA-2(2001,广泛使用)→ SHA-3(2015,最新标准)。目前推荐使用 SHA-2(特别是 SHA-256 和 SHA-512)和 SHA-3。
SHA-1 产生 160 位(20 字节)的摘要值,使用 Merkle-Damgård 结构,数据以 512 位分组处理。SHA-1 是 Git 版本控制系统的核心哈希算法。
安全状态:已弃用。2017年,Google 和 CWI Amsterdam 联合发起 SHAttered 攻击,首次在实战中产生 SHA-1 碰撞。各主流浏览器已停止接受 SHA-1 证书。
SHA-2 是由 NSA 设计的一族哈希函数,使用 Merkle-Damgård 结构,以 Davies-Meyer 压缩函数为核心。SHA-2 是目前最广泛部署的密码学哈希标准。
| 算法 | 输出长度 | 分组大小 | 字长 | 轮数 | 速度 (GB/s) | 安全状态 |
|---|---|---|---|---|---|---|
| SHA-224 | 224 bit | 512 bit | 32 bit | 64 | ~1.8 | 安全 |
| SHA-256 | 256 bit | 512 bit | 32 bit | 64 | ~1.8 | 安全 |
| SHA-384 | 384 bit | 1024 bit | 64 bit | 80 | ~2.5 | 安全 |
| SHA-512 | 512 bit | 1024 bit | 64 bit | 80 | ~2.5 | 安全 |
| SHA-512/224 | 224 bit | 1024 bit | 64 bit | 80 | ~2.5 | 安全 |
| SHA-512/256 | 256 bit | 1024 bit | 64 bit | 80 | ~2.5 | 安全 |
SHA-256 的关键应用:
- TLS/SSL 证书签名
- Bitcoin 区块链(工作量证明使用双重 SHA-256)
- JWT (JSON Web Token) 签名
- 代码签名和软件分发验证
- DNSSEC
SHA-3 基于Guido Bertoni、Joan Daemen、Michaël Peeters 和 Gilles Van Assche 设计的 Keccak 算法,于 2012年 10 月赢得 NIST 哈希函数竞赛,2015年正式标准化(FIPS 202)。
SHA-3 使用海绵结构(Sponge Construction)而非 Merkle-Damgård 结构,这使其在理论上更加安全,不易受长度扩展攻击影响。SHA-3 的内部状态大小为 1600 位,基于宽度为 b=1600 的 Keccak-f[1600] 置换。
| 算法 | 输出长度 | 容量 c | 安全级别 | 速度 |
|---|---|---|---|---|
| SHA3-224 | 224 bit | 448 | 112 bit | ~1.4 GB/s |
| SHA3-256 | 256 bit | 512 | 128 bit | ~1.2 GB/s |
| SHA3-384 | 384 bit | 768 | 192 bit | ~1.0 GB/s |
| SHA3-512 | 512 bit | 1024 | 256 bit | ~0.8 GB/s |
此外,SHA-3 标准还定义了两个可扩展输出函数(XOF):
- SHAKE128:可输出任意长度的摘要,128 位安全级别
- SHAKE256:可输出任意长度的摘要,256 位安全级别
| 特性 | SHA-1 | SHA-2 | SHA-3 |
|---|---|---|---|
| 结构 | Merkle-Damgård | Merkle-Damgård | 海绵结构 |
| 压缩函数 | 专用设计 | Davies-Meyer | Keccak-f 置换 |
| 状态大小 | 160 bit | 256/512 bit | 1600 bit |
| 长度扩展攻击 | 脆弱 | 脆弱(需HMAC) | 免疫 |
| 碰撞安全 | 已破解 | 安全 | 安全 |
| 标准化年份 | 1995 | 2001 | 2015 |
| 推荐使用 | 否 | 是 | 是 |
- NIST (2015). "Secure Hash Standard (SHS)". FIPS PUB 180-4.
- NIST (2015). "SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions". FIPS PUB 202.
- Stevens, M., Bursztein, E., et al. (2017). "The first collision for full SHA-1". CRYPTO 2017.
- Bertoni, G., Daemen, J., Peeters, M., Van Assche, G. (2011). "The Keccak sponge function family".