SHA(安全哈希算法)

SHA
Secure Hash Algorithm
设计者
NSA / NIST
首次发布
1993 (SHA-0)
类别
密码学哈希函数
输出长度
160 ~ 512 bit
标准
FIPS 180-4 / FIPS 202
变体
SHA-0, SHA-1, SHA-2, SHA-3

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

SHA-1 产生 160 位(20 字节)的摘要值,使用 Merkle-Damgård 结构,数据以 512 位分组处理。SHA-1 是 Git 版本控制系统的核心哈希算法。

SHA-1("abc") = a9993e364706816aba3e25717850c26c9cd0d89d SHA-1("") = da39a3ee5e6b4b0d3255bfef95601890afd80709

安全状态:已弃用。2017年,Google 和 CWI Amsterdam 联合发起 SHAttered 攻击,首次在实战中产生 SHA-1 碰撞。各主流浏览器已停止接受 SHA-1 证书。

SHA-2

SHA-2 是由 NSA 设计的一族哈希函数,使用 Merkle-Damgård 结构,以 Davies-Meyer 压缩函数为核心。SHA-2 是目前最广泛部署的密码学哈希标准。

算法输出长度分组大小字长轮数速度 (GB/s)安全状态
SHA-224224 bit512 bit32 bit64~1.8安全
SHA-256256 bit512 bit32 bit64~1.8安全
SHA-384384 bit1024 bit64 bit80~2.5安全
SHA-512512 bit1024 bit64 bit80~2.5安全
SHA-512/224224 bit1024 bit64 bit80~2.5安全
SHA-512/256256 bit1024 bit64 bit80~2.5安全
SHA-256("abc") = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad SHA-512("abc") = ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a 2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f

SHA-256 的关键应用:

  • TLS/SSL 证书签名
  • Bitcoin 区块链(工作量证明使用双重 SHA-256)
  • JWT (JSON Web Token) 签名
  • 代码签名和软件分发验证
  • DNSSEC
SHA-3 (Keccak)

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-224224 bit448112 bit~1.4 GB/s
SHA3-256256 bit512128 bit~1.2 GB/s
SHA3-384384 bit768192 bit~1.0 GB/s
SHA3-512512 bit1024256 bit~0.8 GB/s

此外,SHA-3 标准还定义了两个可扩展输出函数(XOF):

  • SHAKE128:可输出任意长度的摘要,128 位安全级别
  • SHAKE256:可输出任意长度的摘要,256 位安全级别
三族对比
特性SHA-1SHA-2SHA-3
结构Merkle-DamgårdMerkle-Damgård海绵结构
压缩函数专用设计Davies-MeyerKeccak-f 置换
状态大小160 bit256/512 bit1600 bit
长度扩展攻击脆弱脆弱(需HMAC)免疫
碰撞安全已破解安全安全
标准化年份199520012015
推荐使用
参考文献
  1. NIST (2015). "Secure Hash Standard (SHS)". FIPS PUB 180-4.
  2. NIST (2015). "SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions". FIPS PUB 202.
  3. Stevens, M., Bursztein, E., et al. (2017). "The first collision for full SHA-1". CRYPTO 2017.
  4. Bertoni, G., Daemen, J., Peeters, M., Van Assche, G. (2011). "The Keccak sponge function family".