密碼儲存使用單向密碼雜湊函式,而非加密。驗證程式會使用儲存值中內嵌的設定對提交的密碼進行雜湊,並比較編碼後的結果。設計並不包含復原明文密碼;取得資料庫的攻擊者會改為離線測試候選密碼。因此,現代密碼雜湊需要為每組密碼使用隨機鹽值,並採用刻意提高運算成本且受支援的演算法。
crypt 編碼雜湊
#
歷史悠久的 crypt(3) 介面接受密碼和設定。其模組化格式常見形式如下:
$id$parameters$salt$checksum識別碼和參數語法會選擇演算法;鹽值讓相同密碼產生不同的儲存值;校驗碼則是驗證值。驗證時會將完整的儲存字串作為設定提供,因此應用程式必須原樣保留該字串。傳統 DES crypt 改用兩個字元的鹽值,並不適合用於新的密碼雜湊。
glibc 過去的 libcrypt 記載了 $1$(MD5)、$5$(SHA-256)和 $6$(SHA-512);SHA 格式接受 rounds=N。這些格式具備歷史相容性,並不表示 MD5 或 DES 適合新的部署。可用的方法和接受的識別碼取決於實作和建置組態,而非可攜的 POSIX 密碼格式。
crypt 回傳靜態儲存空間,因此無法安全地並行呼叫。crypt_r 使用呼叫端提供的 struct crypt_data;該結構必須按照實作要求初始化,且不得由多個執行緒共用。比較前應檢查失敗情況:實作可能回傳 NULL 或無效值。應用程式自行處理雜湊比較時,請使用常數時間比較,並在 API 允許後立即清除密碼資料。
struct crypt_data data = {0};
char *candidate = crypt_r(password, stored_hash, &data);
if (candidate != NULL && constant_time_equal(candidate, stored_hash)) {
/* authenticated */
}此範例說明驗證機制,而非登入架構。支援 PAM 的程式應將驗證委派給 PAM,而非自行讀取帳戶資料庫或實作提示和節流機制。
glibc 與 libxcrypt 相容性 #
crypt 是選用的 POSIX XSI 介面。glibc 2.39 已移除其內建的 libcrypt;Linux 發行版現多由 libxcrypt 提供此功能。libxcrypt 可以提供具有 glibc 相容符號版本的 libcrypt.so.1,使連結至 glibc 歷史函式庫的既有 Linux 二進位檔得以繼續載入。未設定此相容性的系統會安裝不同的 ABI 名稱,因此必須分別檢查建置和執行階段相容性。
除 crypt 和 crypt_r 外,libxcrypt 也提供源自 Openwall 的介面:
crypt_rn接受明確指定大小的呼叫端緩衝區;crypt_ra配置或調整其工作儲存空間;crypt_gensalt、crypt_gensalt_rn和crypt_gensalt_ra產生設定和鹽值。
libxcrypt 支援一組可設定的歷史及現代方案,包括在啟用該功能的建置中支援 yescrypt。請勿僅根據識別碼推斷支援狀態。應選擇發行版支援的密碼原則、使用作業系統的密碼學隨機來源產生鹽值,並使用該方案文件所載的成本參數。提高成本會影響每次互動式登入,因此必須進行容量測試;遷移期間則必須保留對既有雜湊的驗證支援,直到每個帳戶都在成功驗證後重新雜湊為止。
Shadow 所有權 #
/etc/passwd 必須保持可讀,讓程序能將數值 ID 對應至帳戶名稱。在使用 shadow 的系統上,其密碼欄位一般為 x,而密碼雜湊和效期資料則位於 /etc/shadow。一筆 shadow 記錄包含帳戶名稱、編碼後的雜湊或鎖定標記、上次變更日期、最短與最長效期、警告與停用期間、到期日,以及保留欄位。
shadow 檔案屬於具權限的帳戶資料。其擁有者和模式由發行版原則決定,但一般使用者不得讀取雜湊。shadow 套件負責 passwd、chpasswd、pwconv 和 pwunconv 等公用程式;程式碼不應直接剖析及重寫 /etc/shadow。NSS 查詢 API 可以讀取 shadow 資料,但存取控制仍然適用。
驗證與遷移 #
登入時,支援 PAM 的服務會啟動 PAM 交易。pam_unix 等模組透過應用程式的對話回呼取得憑證、以必要權限讀取已設定的帳戶資料、叫用已設定的雜湊實作,並向 PAM 堆疊回報成功或失敗。帳戶效期、鎖定狀態、多重要素方法、目錄驗證和速率限制原則應由該堆疊及其支援服務負責。
遷移步驟如下:
- 在帳戶管理原則中設定受支援的現行演算法及其成本;
- 僅在遷移期間啟用舊版驗證;
- 在下次成功變更密碼或驗證登入時重新雜湊;
- 讓無法完成遷移的帳戶到期或予以重設;以及
- 當所有儲存的雜湊皆不再需要舊版演算法時,移除舊版演算法。
libxcrypt 介面文件、crypt(3) 和 shadow(5) 說明平台專屬的合約。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)