安全性或許最重要,但速度排第二。
作者見過許多案例:開發者不肯從 MD5 換成 SHA-1,只因為 MD5 比較快;或不肯從 SHA-1 換成 SHA-2,因為 SHA-2 明顯比 SHA-1 慢。
不幸的是 SHA-3 並不比 SHA-2 快,而既然 SHA-2 仍然安全,升級到 SHA-3 的誘因就很少。
那要如何比 SHA-1 與 SHA-2 更快、同時又更安全?答案是 SHA-3 競賽之後發布的雜湊函式 BLAKE2。
利益揭露:本書作者是 BLAKE2 的設計者之一,與 Samuel Neves、Zooko Wilcox-O’Hearn 及 Christian Winnerlein 共同設計。
設計目標#
BLAKE2 的設計懷抱以下想法:
- 至少要與 SHA-3 一樣安全,甚至更強。
- 要比所有先前的雜湊標準都快,包括 MD5。
- 要適合現代應用使用,能雜湊大量資料——無論是少數幾則大訊息或許多小訊息,帶不帶秘密金鑰皆可。
- 要適合在支援多核平行運算、以及單核內指令級平行的現代 CPU 上使用。
兩個主要函式#
| 函式 | 最佳化平台 | 摘要長度 | 平行變體 | 核心數 |
|---|---|---|---|---|
| BLAKE2b(或就叫 BLAKE2) | 64 位元平台 | 1–64 位元組 | BLAKE2bp | 4 |
| BLAKE2s | 8–32 位元平台 | 1–32 位元組 | BLAKE2sp | 8 |
BLAKE2bp 在現代伺服器與筆電 CPU 上最快,在筆電 CPU 上可以接近 2 Gbps 的速度雜湊。
事實上,BLAKE2 是今日可用的最快安全雜湊,它的速度與功能讓它成為最流行的非 NIST 標準雜湊。BLAKE2 被用在無數軟體應用中,並已整合進 OpenSSL 與 Sodium 等主要密碼學函式庫。
BLAKE2 的規格與參考程式碼見 https://blake2.net/ ↗,最佳化的程式碼與函式庫可從 https://github.com/BLAKE2/ ↗ 下載。
參考程式碼也提供 BLAKE2X——BLAKE2 的一個擴充,能產生任意長度的雜湊值。
壓縮函式#
BLAKE2 的壓縮函式是 Davies–Meyer 建構的變體,額外接收參數作為輸入:
- 計數器:確保每次壓縮函式的行為都像一個不同的函式。
- 旗標:指出該次壓縮函式是否正在處理最後一個訊息區塊,以提升安全性。
這個「最後一個區塊」旗標,正是 BLAKE2 免疫於長度延伸攻擊的原因(見本章「常見錯誤」)。
區塊密碼經過後,狀態的兩個半邊會被 XOR 在一起。

圖 6-8:BLAKE2 的壓縮函式:區塊密碼之後狀態的兩個半邊被 XOR 在一起
核心運算#
BLAKE2 壓縮函式中的區塊密碼,基於串流密碼 ChaCha——它本身又是第 5 章討論過的 Salsa20 串流密碼的變體。
在這個區塊密碼中,BLAKE2b 的核心運算由下列運算鏈組成,它用兩個訊息字 Mᵢ 與 Mⱼ 變換四個 64 位元字的狀態:
a = a + b + Mᵢ
d = (d ⊕ a) >>> 32
c = c + d
b = (b ⊕ c) >>> 24
a = a + b + Mⱼ
d = (d ⊕ a) >>> 16
c = c + d
b = (b ⊕ c) >>> 63