Argon2雜湊驗證|比對密碼與已編碼雜湊
輸入密碼與已有的Argon2編碼雜湊($argon2id$...),檢測兩者是否匹配。全部計算均在瀏覽器本地完成,不會將任何內容傳送到伺服器。
Argon2 雜湊校驗是什麼
Argon2 是2015年密碼雜湊競賽的優勝演算法,如今是新建系統最受推薦的密碼雜湊。它與 bcrypt 最大的不同,在於除計算時間外還能調整記憶體用量。GPU 與專用硬體雖擅長平行運算,卻難以為每個核心配置大量記憶體,因此要求記憶體可顯著抬高暴力破解的成本。
Argon2 的雜湊形如 $argon2id$v=19$m=19456,t=2,p=1$鹽$雜湊值,參數與鹽都嵌在字串之中。 因此校驗時無須另行指定參數,只要雜湊與密碼兩樣即可驗證。本工具執行的正是這項校驗。所有計算都在瀏覽器內完成,您輸入的密碼與雜湊絕不會被傳送到伺服器。
校驗的步驟
-
貼上 Argon2 雜湊
把以
$argon2id$開頭的編碼字串原樣輸入。 - 輸入密碼 填入想要比對的明文密碼。
- 執行校驗 由於演算法刻意大量占用記憶體,處理可能需要數秒。 這正是設計使然。
- 查看結果 會顯示兩者是否一致。
用好本工具的小技巧
- 驗證時,請直接貼上由Argon2雜湊計算工具生成的已編碼雜湊(以 $argon2id$ 開頭的字串)。
- 已編碼雜湊中已經包含了變體型別、記憶體成本、迭代次數和鹽值等全部資訊,因此驗證時無需另行指定這些引數。
- 如果雜湊格式不正確(例如複製時缺漏字元或混入了換行符),系統會顯示錯誤提示,請確認是否完整準確地複製了全文。
- 如果驗證結果顯示不匹配,請檢查密碼中是否意外包含了大小寫差異或前後多餘的空白字元。
這些情境會用到
驗證已實作的認證流程
用已知的雜湊與密碼組合,確認自寫的登入程式能否正確校驗。
確認遷移作業
事先確認自其他系統遷來的雜湊,是否能照原樣通過驗證。
檢視參數是否妥當
從字串中嵌入的 m、t、p 值,可讀出設定了多高的成本。
與產生端來回驗證
可確認由 Argon2 雜湊產生工具所得的值,在此能被正確校驗。
Argon2 的術語
- Argon2id
- Argon2 三個變種中兼顧側通道抗性與 GPU 抗性的版本。新建系統選它是標準做法。
- m(記憶體成本)
- 以 KiB 為單位指定使用的記憶體量。這正是使 Argon2 能抵禦 GPU 攻擊的核心參數。
- t(時間成本)
- 迭代次數。增加它會拉長計算時間,攻擊者的成本也隨之上升。
- p(平行度)
- 平行處理的通道數,依伺服器的核心數來設定。
- 鹽
- 每次雜湊都變換的隨機值。同一密碼也會得到不同的雜湊,從而令彩虹表攻擊失效。
- 編碼雜湊
- 把演算法名、參數、鹽與雜湊值彙整為單一字串的格式,校驗所需的資訊一應俱全。
常見問題
閒話 ― 為什麼密碼只需“比較雜湊”就能完成驗證
密碼驗證乍看之下像是“直接比較已儲存的密碼與輸入的密碼”,但實際的運作機制其實完全不同。伺服器(或者像本工具這樣在客戶端進行處理的場景)會使用與儲存時相同的演算法和相同的鹽值,對輸入的密碼重新計算一次雜湊值,然後只需比較這個新計算出的結果是否與已儲存的雜湊值一致即可。也就是說,原始密碼本身從未被直接“比較”過,僅通過雜湊值之間的一致性判斷就能完成驗證——這正是這種方式的巧妙之處。
這一機制之所以成立,是因為像Argon2這樣的雜湊函式具有“確定性”(deterministic):只要輸入內容、鹽值和引數完全相同,就一定會得到相同的輸出結果。而已編碼的雜湊字串(格式為 $argon2id$v=19$m=...$salt$hash)本身就已經嵌入了計算時使用的全部鹽值和引數,因此驗證時無需另行指定原始引數,僅憑這一串字元本身就足以完成完整的重新計算。
也正是因為具備“單向性”(無法從雜湊值反向推算出原始密碼)和“確定性”(相同輸入必得相同輸出)這兩個特性,服務運營方才能夠完全不儲存使用者的原始密碼,同時依然能夠在登入時安全地完成驗證。即使資料庫不幸遭到洩露,攻擊者所能獲得的也只是雜湊值而已,而對於像Argon2這樣計算成本很高的演算法來說,想要靠暴力破解還原出原始密碼,往往需要耗費極其漫長的時間——這也是它至今仍被廣泛信賴的原因。