所以我正在編寫這個程序,需要檢查密碼散列在etc/shadow中,並將其與用戶輸入的密碼進行比較。我嘗試用hashlib.sha512加密密碼,但結果不一樣。我認爲這是如何醃製的,但我不知道它是否使用普遍的鹽或者我如何每次都可以得到鹽。Python與etc/shadow
tldr;我需要一種讓用戶輸入密碼的方法,然後讓程序對其進行散列並對照etc/shadow進行檢查。有任何想法嗎?
所以我正在編寫這個程序,需要檢查密碼散列在etc/shadow中,並將其與用戶輸入的密碼進行比較。我嘗試用hashlib.sha512加密密碼,但結果不一樣。我認爲這是如何醃製的,但我不知道它是否使用普遍的鹽或者我如何每次都可以得到鹽。Python與etc/shadow
tldr;我需要一種讓用戶輸入密碼的方法,然後讓程序對其進行散列並對照etc/shadow進行檢查。有任何想法嗎?
試試這個https://pypi.python.org/pypi/pam。谷歌的第一個鏈接是python pam
。 查看python-pam的分發包管理器(如果存在)。否則安裝與pip
或easy_install
。
小例子:
>>> import pam
>>> pam.authenticate('fred', 'fredspassword')
False
的passwd字段不只是一個密碼的SHA-512散列*
這在crypt
manpage解釋。格式爲$id$salt$hash
,其中id
指定了哈希方法(1表示MD5,2a用於Blowfish,5表示SHA-256,6表示SHA-512),salt
指定用於該算法的鹽,hash
指定結果應該是。
正如手冊中所暗示的那樣,您實際上可以將整個$id$salt$
傳遞到crypt
函數來代替salt
,並且它會自動使用適當的算法。例如,通過這不會太難。
無論如何,你在做什麼幾乎肯定是一個壞主意。您需要以root
的身份運行,才能訪問/etc/shadow
,如果您確實想驗證用戶是否可以登錄,則需要模擬的不僅僅是密碼驗證,當然您還需要處理安全的輸入,並確保你最終不會將密碼保存在明文中等等。讓PAM爲你做好工作要簡單得多,也更安全。
*我認爲,從理論上講,它可以是,如果它不具有$
它解釋爲一些舊的格式開始......想必這意味着它使用DES算法解釋爲POSIX crypt
。
>>> import crypt
>>> line = 'bob:$1$qda8YAO9$rBiov9uVJlH1/97cbcyEt.:15965:0:99999:7:::'
>>> encript = line.split(':')[1]
>>> encript
--> '$1$qda8YAO9$rBiov9uVJlH1/97cbcyEt.'
>>> i = encript.rfind('$')
>>> salt = encript[:i]
>>> salt
--> '$1$qda8YAO9'
>>> crypt.crypt('bob_password',salt)
--> '$1$qda8YAO9$rBiov9uVJlH1/97cbcyEt.'
>>> encript
--> '$1$qda8YAO9$rBiov9uVJlH1/97cbcyEt.'
我不確定,但可能不訪問影子文件。你不能使用操作系統的API來嘗試登錄用戶(因爲你有用戶名和密碼)嗎?當你可以登錄時,證書是好的,如果沒有,那麼他們不是。 – Hyperboreus
另外,'/ etc/shadow'對於普通用戶來說甚至不應該是可讀的。 – abarnert