在沒有 PAM 的情況下驗證使用者的正確方法是什麼?
由於我的相關問題似乎沒有得到太多的愛,這裡還有一個問題: 現在在 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_auth
和valid
作為身份驗證的輔助功能。我嘗試將這些植入到我的程式碼中並連結libshadow.a
到影子工具,但我得到 ‘unresolved external reference’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
. 有沒有這樣的東西,我還沒有找到?還是其他解決方案?
您擔心更新 shadow-utils 是 IMO 沒有根據的。該 HOWTO 中描述的常式在我的 Ubuntu 12.04 和 Mint 17 系統上可用,無需安裝任何特殊的東西。
在 C 程序中讀取
/etc/shadow
資訊的結構可以在/usr/include/shadow.h
和 with中找到,以及man 5 shadow
您需要找到的功能,例如,按名稱定義的影子密碼條目/usr/include/shadow.h
isgetspnam
並且還會為您提供一個手冊頁 (man getspnam
) 來描述它和所有相關功能。基於此,您應該能夠獲取任何給定名稱的散列密碼條目。散列密碼應該有多個 ’ $ ’ tokens, cut of everything after and including the last ’ $ ’ 從散列密碼中顯示,作為 salt to
crypt()
,glibc 版本(根據man 3 crypt
)應該能夠處理指示 SHA512 條目的“擴展”鹽,因為現在更常見。