在沒有 PAM 的情況下驗證使用者身分的正確方法是什麼?

在沒有 PAM 的情況下驗證使用者身分的正確方法是什麼?

由於我的相關問題似乎沒有受到太多關注,這裡還有另一個問題: 如今,在 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_authvalid作為身份驗證的輔助函數。我嘗試將這些植入到我的程式碼中並連結到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.hgetspnam也會為您提供一個手冊頁 ( man getspnam) 描述該內容和所有相關功能。

基於此,您應該能夠獲取任何給定名稱的雜湊密碼條目。雜湊密碼應該有多個“$”標記,從雜湊密碼中刪除最後一個“$”之後的所有內容,包括最後一個“$”,並將其作為鹽呈現給crypt(),glibc 版本(根據man 3 crypt)應該能夠處理“擴展”鹽表示當今更常見的 SHA512 條目。

相關內容