Argon2雜湊計算|支援Argon2id・Argon2i・Argon2d

輸入密碼等字串即可計算Argon2雜湊值。支援Argon2id、Argon2i、Argon2d三種方式,並可選擇OWASP推薦的記憶體開銷・迭代次數預設。全部計算均在瀏覽器內完成,輸入內容不會發送到伺服器。

什麼是 Argon2 雜湊計算

Argon2 雜湊計算是只需輸入密碼等字串,即可以 Argon2id・Argon2i・Argon2d 三種方式之一產生雜湊值的工具。作為密碼雜湊競賽(PHC)優勝演算法的 Argon2,不僅能抵禦單純的暴力破解,對 GPU、ASIC 等專用硬體發起的高速攻擊同樣強韌,因此被廣泛作為新開發系統中保存密碼的首選。

雜湊的強度由記憶體成本、迭代次數、平行度三個參數決定,取值越大攻擊者的計算成本越高,但正規登入處理所需的時間與記憶體也會同時增加。本工具可選擇 OWASP Password Storage Cheat Sheet 建議的五種組合作為預設,建議先試其中一種,再依實際運行伺服器的效能加以調整。

Argon2 雜湊計算的使用方式

  1. 輸入密碼(字串) 在「密碼(字串)」欄中輸入想要雜湊化的字串。輸入內容不會傳送至外部。
  2. 選擇變體 若無特別理由,請選擇兼顧 GPU 抗性與側通道抗性的「Argon2id(建議)」。
  3. 套用 OWASP 建議預設 按下預設按鈕後,記憶體成本、迭代次數、平行度會自動設為 OWASP 建議的組合。
  4. 如有需要可分別調整參數 記憶體成本(KiB)、迭代次數、平行度可在數值欄中直接編輯。取值越大計算時間越長。
  5. 按下「計算雜湊」確認結果 會顯示 PHC 格式的編碼後雜湊,以及實際所花的計算時間。可用複製按鈕留存結果。

用好本工具的小技巧

  • Argon2 是2015年“密碼雜湊競賽”(Password Hashing Competition)的優勝演算法,其中Argon2id是OWASP目前推薦的方式。若無特殊理由,建議選擇Argon2id。
  • 預設按鈕對應OWASP密碼儲存備忘單(Password Storage Cheat Sheet)推薦的5種記憶體開銷・迭代次數組合。記憶體開銷越大,對GPU並行破解的抵抗力越強。
  • 提高“並行度(p)”在瀏覽器端的WebAssembly實現中並不會真正並行處理,計算耗時幾乎不變。並行度帶來的加速僅在多核伺服器環境下才有效。
  • 鹽值會在每次計算時自動重新生成,因此即使是相同的字串和引數,每次輸出的完整雜湊編碼也不同。
  • 將記憶體開銷設定得過大時,瀏覽器標籤頁可能會暫時無響應。建議先從幾十MB左右開始嘗試。

Argon2 雜湊計算的應用情境

研究新服務的密碼保存方式

在為新建系統研究如何保存密碼時,可當場確認實際的雜湊長度以及各參數下的計算時間。

建構 API 金鑰、權杖的安全保管形式

不限於登入密碼,若希望把 API 金鑰或共享密鑰這類機密字串雜湊化後保存、而非以明文置於資料庫,同樣可以使用。

準備開發、測試用的虛擬雜湊

無須啟動應用程式,即可在此產生用於直接寫入資料庫的測試帳號雜湊值。

體感記憶體成本、迭代次數與計算時間的關係

改變參數計算數次並對比結果中的「計算時間」欄,可作為判斷適合正式伺服器設定的依據。

研究由既有系統的 BCrypt 移轉

把同一字串也用BCrypt 雜湊計算產生,比較輸出格式與所需時間,可作為移轉的判斷材料。

Argon2 雜湊計算相關用語

Argon2id
兼具 Argon2d 與 Argon2i 兩者性質的混合方式。同時具備對 GPU 攻擊與側通道攻擊的抗性,OWASP 將其列為首要建議。
Argon2i
記憶體存取順序不依賴於輸入的方式,對側通道攻擊(自執行時間或電力消耗讀取資訊的攻擊)較強,但 GPU 抗性略遜於 Argon2d。
Argon2d
記憶體存取順序依賴於輸入的方式,對 GPU 或 ASIC 的平行攻擊抗性最高,但具有易受側通道攻擊的特點。
記憶體成本
以 KiB 為單位指定雜湊計算所用記憶體量的參數。取值越大,專用硬體平行攻擊的成本越高。
迭代次數
亦稱「時間成本」,用於指定內部處理重複多少次的參數。取值越大計算時間越長,對暴力破解的抗性也越高。
平行度
指定平行執行計算的通道數的參數。在伺服器的多核心環境下有助於提速,但在瀏覽器上的 WebAssembly 實作中不起作用。
鹽值
雜湊化之前附加的隨機值。本工具在每次計算時自動產生,因此即便字串與參數相同,每次輸出的雜湊也不相同。
PHC 格式
由密碼雜湊競賽制定的、把演算法名稱、版本、參數、鹽值與雜湊本體彙整為一條字串的編碼格式,形如 $argon2id$v=19$m=... 。

常見問題

如果是新開發的系統,Argon2id是首選方案,OWASP目前也將Argon2id列為第一推薦。不過如果現有系統已在使用BCrypt,遷移時需要注意重新計算雜湊(例如在下次登入時重新雜湊)。

Argon2d 對GPU攻擊的抵抗力最強,但容易受到側通道攻擊;Argon2i 則相反。Argon2id 是結合兩者設計的混合方案,若無特殊理由,建議優先選擇Argon2id。

本工具的預設按鈕對應OWASP密碼儲存備忘單推薦的5種組合。如果要在伺服器上實際使用,建議以單次雜湊計算耗時100〜500毫秒左右為目標,並結合可用記憶體進行調整。

可以。由於使用的是標準Argon2演算法,生成的雜湊值可以直接通過PHP的password_verify()或其他語言的Argon2驗證庫進行校驗。不過請務必妥善處理輸入內容。

不會。雜湊計算全部在瀏覽器內的WebAssembly中完成,輸入內容不會被發送到任何外部伺服器。
工具君

閒話 ― 密碼雜湊競賽與Argon2的誕生背景

Argon2 是在2013年至2015年舉辦的“密碼雜湊競賽(Password Hashing Competition, PHC)”中,從24個參賽方案中脫穎而出、被選為最優演算法的成果。這場競賽之所以舉辦,正是因為BCrypt(1999年)、PBKDF2(2000年)等既有方式存在一個共同弱點——容易被GPU、ASIC等專用硬體加速暴力破解。為了克服這一弱點,Argon2 在設計上刻意要求計算過程消耗大量記憶體,讓專用硬體的並行優勢難以發揮。

有趣的是,Argon2 並非只有一種形態,而是共有3種變體,各自的取捨也不盡相同。Argon2d對GPU攻擊的抵抗力最強,但容易受到側通道攻擊;Argon2i則正好相反,能較好抵禦側通道攻擊,但GPU抵抗力略遜一籌。而Argon2id正是結合兩者優點的混合方案,這也是OWASP等眾多安全機構都將其列為密碼儲存首選演算法的原因。

也正因為如此,Argon2id 如今已逐漸成為新系統的標準配置。PHP 自7.2版本起,只需在password_hash()函式中指定PASSWORD_ARGON2ID常量即可生成對應雜湊;Node.js、Python、Ruby等主流語言也都提供了官方或準官方的庫支援。可以說,在新開發的系統中,越來越多的開發者已經把Argon2id當作密碼儲存的第一選擇,而不再是曾經的主流BCrypt。