安全性或許最重要,但速度排第二

作者見過許多案例:開發者不肯從 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 位元組BLAKE2bp4
BLAKE2s8–32 位元平台1–32 位元組BLAKE2sp8

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