
由於我的相關問題似乎沒有受到太多關注,這裡還有另一個問題: 如今,在 Linux 中透過使用者名稱/密碼提示來驗證使用者身分的正確方法是什麼?
原則上,我想我必須獲取用戶名和密碼,從 中讀取相應用戶的鹽和雜湊值/etc/shadow
。然後,我將計算給定密碼和儲存的鹽的雜湊值,並檢查結果是否與儲存在/etc/shadow
.
通常,我可以簡單地透過 PAM(例如pam_unix
)進行身份驗證,PAM 已經完成了所有這些工作,但我的應用程式是一個自訂 PAM 模組,我發現沒有方法可以從另一個 PAM 模組呼叫一個 PAM 模組。如果這是可能的,我很樂意採用這個解決方案。
截至目前,我發現這個教學確實過時了http://www.tldp.org/HOWTO/Shadow-Password-HOWTO-8.html從 1996 年開始,顯然,影子支援還沒有內建到 libc 中。它提到pw_auth
和valid
作為身份驗證的輔助函數。我嘗試將這些植入到我的程式碼中並連結到libshadow.a
影子工具,但我收到pw_auth
和 的「未解析的外部引用」錯誤valid
。程式碼看起來像這樣:
if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
&& pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL))
|| !valid (passwd, pw)) {
return (UPAP_AUTHNAK);
}
我沒有進一步檢查這一點,但無論如何這不是首選解決方案,因為每次更新 Shadow-utils 時我都必須更新我的程式碼。
我更願意連結到一個提供針對/etc/shadow
.有這樣的東西嗎,我還沒找到?或其他解決方案?
答案1
在我看來,你對 Shadow-utils 更新的恐懼是沒有根據的。該 HOWTO 中描述的例程可在我的 Ubuntu 12.04 和 Mint 17 系統上使用,無需安裝任何特殊內容。
/etc/shadow
在 C 程式中讀取資訊的結構可以在/usr/include/shadow.h
和 中找到man 5 shadow
,並且您需要找到例如按名稱定義的影子密碼條目的函數,/usr/include/shadow.h
這getspnam
也會為您提供一個手冊頁 ( man getspnam
) 描述該內容和所有相關功能。
基於此,您應該能夠獲取任何給定名稱的雜湊密碼條目。雜湊密碼應該有多個“$”標記,從雜湊密碼中刪除最後一個“$”之後的所有內容,包括最後一個“$”,並將其作為鹽呈現給crypt()
,glibc 版本(根據man 3 crypt
)應該能夠處理“擴展”鹽表示當今更常見的 SHA512 條目。