SHA 家族完整指南:SHA-1、SHA-256、SHA-3 的差异与选择

当你在浏览器地址栏看到 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 的替代方案
SHA ≠ 加密
和 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-224224 bit256 bitSHA-256 的截断版,较少使用
SHA-256256 bit256 bitTLS、代码签名、Bitcoin、一般安全用途
SHA-384384 bit512 bitSHA-512 的截断版,TLS 1.2 套件
SHA-512512 bit512 bit高安全性需求、64 位平台性能更佳
SHA-512/224224 bit512 bit需要 224 位输出但使用 64 位运算
SHA-512/256256 bit512 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-1160 bit已破解(SHAttered 2017)不建议新系统使用
SHA-256256 bit安全(目前无已知碰撞)中等(有硬件加速)TLS、证书、代码签名、一般用途
SHA-512512 bit安全(更高边际)在 64 位平台快于 SHA-256高安全性需求、64 位系统
SHA3-256256 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 以全新的海绵结构提供了设计多样性。掌握这些差异,能让你在系统设计和技术选型时做出更准确的判断。