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 位(理論上找到碰撞需 22??次運算) |
消息擴展后字數量 | 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(加鹽)哈希后存儲,避免明文泄露。