SHA 散列算法
安全散列算法(Secure Hash Algorithms, SHA)是一組散列函數(台灣地區又稱雜湊函數)的集合,常用於各種用途。
以下是 Arch Linux 中的一些使用示例:
- 驗證 Arch Linux ISO 和軟體包的完整性。
- 使用 Git 固定軟體版本。
- 加密密鑰的安全保護和驗證,例如磁碟加密。
- 密碼驗證,詳見安全#密碼的散列值以及本文中的相關 SHA 散列的介紹。
SHA 密碼散列
自 shadow包 軟體包的 4.1.4.3-3 版本(參見 bug 13591)到 4.14.0 版本(參見這則公告)內,Arch Linux 默認將 SHA-512 作為密碼散列函數。它取代了較為老舊的、因存在碰撞攻擊漏洞而已經被攻破的 MD5 散列函數。有關更多信息,參見zhwp:SHA家族#SHA函數對比。
配置
可以使用 rounds=N 選項來配置密碼散列函數,這可以提升 {{zhwp:密鑰延伸|密鑰延伸(Key strengthening)}} 。例如 rounds=65536 意味著對於每一個要測試的密碼,攻擊者均需要重複計算 65536 次散列值才能與 /etc/shadow 中的密碼散列值進行比對。
因此,攻擊者的破解速度將會延緩 65536 倍。這也意味著登錄時也需要計算 65536 次散列值,但是即便在慢速計算機上,這個流程也不會超過一秒。
從 pam包 1.6.0 版本開始,可以通過以下兩種方式配置 SHA-512 的 rounds 選項:編輯 /etc/login.defs 文件,為 SHA_CRYPT_MAX_ROUNDS 參數設置一個值;或者編輯 /etc/pam.d/passwd 並添加合適的值的 rounds 選項[1]。
如果不使用 rounds 選項,那麼 PAM 將使用一個與 /etc/login.defs 中注釋掉的 5000 輪示例不同的默認值,因為與 PAM 走獨立驗證棧和獨立配置文件 /etc/pam.d 不同的是,shadow包 源碼中硬編碼了默認值[2]。
例如:
/etc/pam.d/passwd
password required pam_unix.so sha512 shadow nullok rounds=65536
sha512 等散列算法,它將會覆蓋後續運行 passwd 命令時默認使用的 yescrypt 散列算法。如需了解 /etc/pam.d/passwd 密碼選項的詳細說明,參閱 pam_unix(8)。
使用方法
即便更新了加密設置,在此之前設置的密碼也並不會自動重新計算散列值。若需解決這個問題,需要重置所有用戶的密碼,以便於使用新的算法重新計算散列值。
以 root 身份執行以下命令
# passwd username
其中 username 是需要修改密碼的用戶名,隨後重新輸入他們當前的密碼,系統就會使用新算法對重新計算散列值。
若需驗證密碼是否已經重新計算散列值,以 root 身份檢查 /etc/shadow 文件。
- 使用 SHA-256 的密碼散列值以
$5開頭。 - 使用 SHA-512 的密碼散列值以
$6開頭。 - 使用 yescrypt 的密碼散列值以
$y開頭。