SHA-512 是 SHA-2(Secure Hash Algorithm 2)系列密码散列函数的重要成员,由美国国家安全局(NSA)设计,2001 年被纳入 NIST(美国国家标准与技术研究院)的 FIPS 180 标准,后经 FIPS 180-2、FIPS 180-3、FIPS 180-4 多次更新,成为目前广泛应用的哈希算法之一。
1 算法基本特性
SHA-512 的核心参数决定了其运算规模和安全等级,具体如下:
参数 | 数值 / 说明 |
输出哈希值长度 | 512 位(64 字节),固定长度输出 |
消息块大小 | 1024 位(128 字节),分块处理的基本单位 |
字长 | 64 位,所有运算基于 64 位寄存器执行 |
运算轮数 | 80 轮,每轮使用不同的函数和常量 |
抗碰撞安全强度 | 256 位(理论上找到碰撞需 2²⁵⁶次运算) |
消息扩展后字数量 | 80 个(从 16 个原始消息字扩展而来) |
2 核心设计原理
SHA-512 基于Merkle-Damgård 结构,这是一种迭代型哈希函数设计框架,核心思想是:将任意长度的输入消息转换为固定长度的哈希值,过程分为 “消息预处理→分块迭代压缩→最终哈希值生成” 三部分,通过 “压缩函数” 对每块消息进行处理,并更新哈希状态。
3 详细流程
3.1 消息预处理(填充)
为了让输入消息长度满足分块要求(1024 位的整数倍),需对原始消息进行填充,步骤如下:
第一步:补 “1”
在原始消息末尾添加一个二进制位 “1”(即 0x80)。
第二步:补 “0”
继续添加 k 个二进制位 “0”,使得填充后消息的长度满足:
(原始消息长度 + 1 + k) mod 1024 = 896(即剩余空间恰好为 128 位,用于存储原始消息的长度)。
第三步:补长度信息
在末尾添加 128 位的 “原始消息位长度”(大端序表示)。例如,若原始消息长度为 n 位,则添加 n 的 128 位二进制表示。
示例:若原始消息长度为 1000 位,则:
1000 + 1 + k ≡ 896 mod 1024 → k = 896 - 1001 mod 1024 = 919 位(补 919 个 0),最后补 128 位长度信息,总长度为 1000+1+919+128=2048 位(2 个 1024 位块)。
3.2 初始化哈希值(初始向量)
SHA-512 的初始哈希值由 8 个 64 位常量组成,这些常量来自前 8 个质数(2、3、5、7、11、13、17、19)的立方根小数部分的前 64 位,具体值如下:
变量 | 十六进制值(64 位) | 变量 | 十六进制值(64 位) |
H₀ | 0x6a09e667f3bcc908 | H₄ | 0x510e527fade682d1 |
H₁ | 0xbb67ae8584caa73b | H₅ | 0x9b05688c2b3e6c1f |
H₂ | 0x3c6ef372fe94f82b | H₆ | 0x1f83d9abfb41bd6b |
H₃ | 0xa54ff53a5f1d36f1 | H₇ | 0x5be0cd19137e2179 |
这些值将作为压缩运算的初始状态,每处理一个 1024 位块后更新。
3.3 消息扩展(生成 80 个消息字)
每个 1024 位的消息块会被拆分为 16 个 64 位字(记为 W₀~W₁₅),再通过扩展算法生成剩余 64 个字(W₁₆~W₇₉),公式如下:
Wt=σ1(Wt−2)+Wt−7+σ0(Wt−15)+Wt−16
其中:
σ0(x)=ROTR1(x)⊕ROTR8(x)⊕SHR7(x)
(ROTR 为循环右移,SHR 为逻辑右移)
σ1(x)=ROTR19(x)⊕ROTR61(x)⊕SHR6(x)
所有运算为 64 位无符号整数加法(模 2⁶⁴)。
3.4 压缩函数(80 轮迭代运算)
对每个消息块,压缩函数会基于扩展后的 80 个消息字(W₀~W₇₉)进行 80 轮运算,更新哈希状态。过程如下:
(1)初始化轮变量
将当前哈希值(H₀~H₇)复制到 8 个临时变量中:
a = H₀, b = H₁, c = H₂, d = H₃, e = H₄, f = H₅, g = H₇, h = H₇。
(2)80 轮迭代(每轮更新变量)
每一轮 t(0≤t≤79)的运算公式为:
T1=h+∑1(e)+Ch(e,f,g)+Kt+Wt
T2=∑0(a)+Maj(a,b,c)
h=g
g=f
f=e
e=d+T1
d=c
c=b
b=a
a=T1+T2
其中:
Kₜ:80 个 64 位轮常量,来自前 80 个质数的平方根小数部分的前 64 位(固定值,可查表)。
核心函数:
Ch(x,y,z)=(x&y)⊕(¬x&z)(选择函数:若 x 为 1 则选 y,否则选 z)
Maj(x,y,z)=(x&y)⊕(x&z)⊕(y&z)(多数函数:返回 x、y、z 中出现次数最多的值)
∑0(x)=ROTR28(x)⊕ROTR34(x)⊕ROTR39(x)
∑1(x)=ROTR14(x)⊕ROTR18(x)⊕ROTR41(x)
(3)更新哈希值
80 轮结束后,将临时变量与初始哈希值相加(模 2⁶⁴),得到新的哈希状态:
H0=H0+a
H1=H1+b
...
H7=H7+h
3.5 生成最终哈希值
所有消息块处理完成后,将最终的 H₀~H₇按顺序拼接(大端序),得到 512 位的 SHA-512 哈希值。
4 算法特点
- 高安全性:512 位输出长度和 256 位抗碰撞强度,适用于高安全需求场景(如数字签名、区块链)。
- 雪崩效应:输入消息的微小变化(如 1 位翻转)会导致输出哈希值完全不同,确保数据完整性校验的可靠性。
- 不可逆性:从哈希值无法反推原始消息,适合存储密码(结合盐值使用)。
- 高效性:相比 SHA-1,运算复杂度更高,但现代硬件(如 CPU 指令集优化)可实现高效计算。
5 应用场景
- 数字签名:如用于 PDF、软件包的签名验证,确保文件未被篡改。
- 区块链:比特币等加密货币中用于生成区块哈希,保证链上数据不可篡改。
- 数据校验:大型文件传输(如备份、分布式存储)的完整性校验。
密码存储:将用户密码通过 SHA-512(加盐)哈希后存储,避免明文泄露。