2013-08-07 16 views
-1

所以我正在編寫這個程序,需要檢查密碼散列在etc/shadow中,並將其與用戶輸入的密碼進行比較。我嘗試用hashlib.sha512加密密碼,但結果不一樣。我認爲這是如何醃製的,但我不知道它是否使用普遍的鹽或者我如何每次都可以得到鹽。Python與etc/shadow

tldr;我需要一種讓用戶輸入密碼的方法,然後讓程序對其進行散列並對照etc/shadow進行檢查。有任何想法嗎?

+2

我不確定,但可能不訪問影子文件。你不能使用操作系統的API來嘗試登錄用戶(因爲你有用戶名和密碼)嗎?當你可以登錄時,證書是好的,如果沒有,那麼他們不是。 – Hyperboreus

+0

另外,'/ etc/shadow'對於普通用戶來說甚至不應該是可讀的。 – abarnert

回答

3

試試這個https://pypi.python.org/pypi/pam。谷歌的第一個鏈接是python pam。 查看python-pam的分發包管理器(如果存在)。否則安裝與pipeasy_install

小例子:

>>> import pam 
>>> pam.authenticate('fred', 'fredspassword') 
False 
+0

不知道爲什麼這個人被拒絕投票 - 我認爲它是最好的解決方案。沒有su/shadow/hash技巧,可以在使用不同身份驗證機制的服務器上運行。也許需要一個例子? 'import pam; pam.authenticate('fred','fredspassword')'。 – tdelaney

+0

這不適用於CentOs –

+0

@ user1377480,您有回溯嗎?你是如何安裝的? 也許錯過了依賴或者不兼容的庫版本。 – eri

1

的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

2
>>> 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.'