Password Hashing Functions

專為密碼儲存和金鑰衍生設計的密碼雜湊函數(Password Hashing Functions),它們比通用雜湊函數(如 SHA-256)更適合保護密碼,因為它們內建鹽值(Salt)、慢速計算(抗暴力破解)和部分具記憶體密集特性(抗硬體攻擊)。常見的有 Bcrypt、PBKDF2 、Scrypt、Argon2


1. Bcrypt

介紹

  • 1999 年由 Niels Provos 和 David Mazières 設計,基於 Blowfish 對稱加密演算法。
  • 廣泛應用於 Web 應用(如 PHP、Ruby、Node.js)的密碼儲存。

用途

  • 網站用戶密碼儲存(如資料庫)。
  • 簡單易用的密碼雜湊方案。

格式說明

bcrypt 的哈希輸出遵循模組化密碼格式(Modular Crypt Format)

結構:$2b$<cost>$<salt><hash>

  • $2b:算法標識,表示使用 bcrypt(早期版本可能為 $2a 或 $2y)。
  • <cost>:工作因子的對數(2 進位),以兩位數字表示,例如 12 表示 2^12 次迭代。
  • <salt>:22 字元 Base64 編碼的 16 字節鹽值(使用 ./A-Za-z0-9 字符集)。
  • <hash>:31 字元 Base64 編碼的哈希值,包含密碼與鹽值的計算結果。

範例$2b$12$abcdefghijklmnopqrstuvwxz1234567890abcdefghijk

  • 算法:bcrypt
  • 成本因子:12(2^12 次迭代)
  • 鹽值:abcdefghijklmnopqrstuv(22 字元)
  • 哈希值:wxz1234567890abcdefghijk(31 字元)

優缺點

  • 優點:成熟穩定,實現簡單,普及度高。
  • 缺點:設計較老(1999 年),抗硬體攻擊能力有限。


2. PBKDF2(Password-Based Key Derivation Function 2)

介紹

  • 2000 年由 RSA Laboratories 提出,基於現有雜湊函數(如 SHA-256)設計。
  • 用於密碼儲存和金鑰衍生,廣泛應用於加密標準。

用途

  • 密碼儲存(如資料庫)。
  • 金鑰衍生(如 AES 加密金鑰)。
  • 標準化應用(如 WPA2、TrueCrypt)。

格式說明

PBKDF2 本身不定義標準的字符串格式,輸出通常是原始二進位數據或十六進位編碼。常見應用中,會將鹽值、迭代次數和哈希值一起存儲,格式由實現決定。

結構:<algorithm>$<iterations>$<salt>$<hash>

  • <algorithm>:底層哈希算法,如 pbkdf2-sha256。
  • <iterations>:迭代次數,如 100000。
  • <salt>:Base64 或十六進位編碼的鹽值。
  • <hash>:Base64 或十六進位編碼的哈希值。

範例(自定義格式):

pbkdf2-sha256$100000$4d0c7b9e8f2a3b4c5d6e7f8091a2b3c4$8c7b9e8f2a3b4c5d6e7f8091a2b3c4d5e6f7a8b9

  • 算法:PBKDF2 with SHA-256
  • 迭代次數:100,000
  • 鹽值:4d0c7b9e8f2a3b4c5d6e7f8091a2b3c4(16 字節,十六進位)
  • 哈希值:8c7b9e8f2a3b4c5d6e7f8091a2b3c4d5e6f7a8b9(32 字節,十六進位)

優缺點

  • 優點:標準化(NIST 認可),支援多種雜湊函數,廣泛相容。
  • 缺點:記憶體需求低,抗硬體攻擊弱,逐漸被 Argon2 取代。


3. Scrypt

介紹

  • 2009 年由 Colin Percival 設計,最初為 Tarsnap 備份系統開發,後用於密碼儲存和金鑰衍生。
  • 以記憶體密集為特色,專為抗硬體攻擊(如 GPU/ASIC)打造。

用途

  • 密碼儲存(如網站資料庫)。
  • 金鑰衍生(如加密硬碟)。
  • 加密貨幣挖礦(如萊特幣)。

格式說明

scrypt 沒有標準化的字符串格式,輸出通常是二進位或十六進位數據。應用中常自定義格式,包含算法、參數、鹽值和哈希值。

結構:scrypt$<N>$<r>$<p>$<salt>$<hash>

  • <N>:CPU/記憶體成本(2 的冪,如 16384)。
  • <r>:記憶體塊大小(如 8)。
  • <p>:並行度(如 1)。
  • <salt>:Base64 或十六進位編碼的鹽值。
  • <hash>:Base64 或十六進位編碼的哈希值。

範例

scrypt$16384$8$1$4d0c7b9e8f2a3b4c5d6e7f8091a2b3c4$8c7b9e8f2a3b4c5d6e7f8091a2b3c4d5

  • 算法:scrypt
  • N:16384(2^14)
  • r:8
  • p:1
  • 鹽值:4d0c7b9e8f2a3b4c5d6e7f8091a2b3c4(十六進位)
  • 哈希值:8c7b9e8f2a3b4c5d6e7f8091a2b3c4d5(十六進位)

優缺點

  • 優點:記憶體密集,抗硬體攻擊強。
  • 缺點:配置複雜,普及度低於 Bcrypt。


4. Argon2

介紹

  • 2015 年贏得密碼雜湊競賽(Password Hashing Competition),由 Alex Biryukov 等設計。
  • 現代密碼雜湊函數的首選,取代 Bcrypt 和 Scrypt。
  • 有三個變體:Argon2d(抗硬體攻擊)、Argon2i(抗側信道攻擊)、Argon2id(混合,推薦)。

用途

  • 密碼儲存(網站、應用)。
  • 金鑰衍生(加密系統)。

格式說明

Argon2 遵循標準化的模組化密碼格式

結構:$<algorithm>$v=<version>$m=<memory>,t=<iterations>,p=<parallelism>$<salt>$<hash>

  • <algorithm>:argon2i, argon2d 或 argon2id。
  • <version>:算法版本(通常為 19,即 0x13)。
  • <memory>:記憶體使用量(KB)。
  • <iterations>:迭代次數。
  • <parallelism>:並行執行緒數。
  • <salt>:Base64 編碼的鹽值。
  • <hash>:Base64 編碼的哈希值。

範例

$argon2id$v=19$m=65536,t=3,p=4$4d0c7b9e8f2a3b4c5d6e7f80$8c7b9e8f2a3b4c5d6e7f8091a2b3c4d5

  • 算法:Argon2id
  • 版本:19
  • 記憶體:65536 KB(64 MB)
  • 迭代次數:3
  • 並行度:4
  • 鹽值:4d0c7b9e8f2a3b4c5d6e7f80(十六進位,Base64 編碼)
  • 哈希值:8c7b9e8f2a3b4c5d6e7f8091a2b3c4d5(十六進位,Base64 編碼)

優缺點

  • 優點:最現代,安全性最高,靈活配置。
  • 缺點:較新,普及度稍低,配置需專業知識。


比較表格

特性BcryptPBKDF2ScryptArgon2 (Argon2id)
設計年份1999200020092015
基礎演算法Blowfish任意雜湊(如 SHA-256)Salsa20/8Keccak(SHA-3 相關)
記憶體密集否(低記憶體)否(低記憶體)是(可調)是(可調)
鹽值內建隨機鹽值支援隨機鹽值內建隨機鹽值內建隨機鹽值
計算速度慢(可調工作因子)慢(可調迭代次數)慢(可調記憶體/迭代)慢(可調記憶體/迭代)
安全性高(但抗硬體攻擊弱)高(但抗硬體攻擊弱)高(抗硬體攻擊)最高(抗硬體、側信道)
用途密碼儲存密碼儲存、金鑰衍生密碼儲存、金鑰衍生密碼儲存、金鑰衍生
普及度廣泛廣泛(標準化應用)中等(加密貨幣常見)新興,逐漸普及