Linux

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

  • November 14, 2014

由於我的相關問題似乎沒有得到太多的愛,這裡還有一個問題: 現在在 Linux 中通過使用者名/密碼提示驗證使用者的正確方法是什麼?

原則上,我想我必須獲取使用者名和密碼,從/etc/shadow. 然後,我將計算給定密碼和儲存的 salt 的雜湊值,並檢查結果是否與儲存在/etc/shadow.

通常,我可以簡單地通過 PAM(例如pam_unix)進行身份驗證,它已經完成了所有這些,但我的應用程序是一個自定義 PAM 模組,我發現沒有方法可以從另一個 PAM 模組呼叫一個 PAM 模組。如果這是可能的,我很樂意採用這個解決方案。

到目前為止,我發現這個非常過時的教程http://www.tldp.org/HOWTO/Shadow-Password-HOWTO-8.html從 1996 年開始,顯然,影子支持還沒有內置到 libc 中。它提到pw_authvalid作為身份驗證的輔助功能。我嘗試將這些植入到我的程式碼中並連結libshadow.a到影子工具,但我得到 ‘unresolved external reference’pw_authvalid. 程式碼看起來像這樣:

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. 有沒有這樣的東西,我還沒有找到?還是其他解決方案?

您擔心更新 shadow-utils 是 IMO 沒有根據的。該 HOWTO 中描述的常式在我的 Ubuntu 12.04 和 Mint 17 系統上可用,無需安裝任何特殊的東西。

在 C 程序中讀取/etc/shadow資訊的結構可以在/usr/include/shadow.h和 with中找到,以及man 5 shadow您需要找到的功能,例如,按名稱定義的影子密碼條目/usr/include/shadow.hisgetspnam並且還會為您提供一個手冊頁 ( man getspnam) 來描述它和所有相關功能。

基於此,您應該能夠獲取任何給定名稱的散列密碼條目。散列密碼應該有多個 ’ $ ’ tokens, cut of everything after and including the last ’ $ ’ 從散列密碼中顯示,作為 salt to crypt(),glibc 版本(根據man 3 crypt)應該能夠處理指示 SHA512 條目的“擴展”鹽,因為現在更常見。

引用自:https://unix.stackexchange.com/questions/167953