linux的PAM認證和shadow文件中密碼的加密方式


它是一種統一的認證方案。PAM 讓您能隨時改變您的認證方法以及需求,並且不需要重新編譯任何代碼就封裝了所有本地認證方法。具體見 PAM 網站

對於 PAM 您只需要做:

  • 對您的密碼采用不同於 DES 的加密方式(讓它們面對暴力解碼(brute-force decode)時更為堅固)。

  • 對您所有用戶使用資源限額,以防止他們進行拒絕服務(denial-of-service)攻擊(進程數、占用內存量等等)。

  • 隨時啟用 shadow password (見下文)

  • 只在特定的時間允許特定的用戶從特定的地方登錄

上述介紹來源於http://man.ddvip.com/linux/Mandrakelinux10server/password-security.html

========================================


我們看看shadow文件的格式:

格式是:

shadow是個可讀文件,普通用戶沒有讀寫權限,超級用戶權限為可讀寫。

如果密碼字符串為,表示系統用戶不能被登入,為表示用戶名被禁用,如果密碼字符串為空,表示沒有密碼,通過可以清空一個用戶的口令。

具體shadow可參考shadow how-to,盡管這是一份已經過時了的文檔。

下面探討下shadow中的密碼加密問題:

還是以上面的root用戶為例:

其中的密碼域為 ,參考linux標准的passwd.c源文件,在pw_encrypt函數中可以找到加密方法:


也就是說加密用明文密碼和一個叫salt的東西用crypt()加密生成密文。
再來看看crypt的幫助:
http://www.kernel.org/doc/man-pages/online/pages/man3/crypt.3.html
可發現原來crypt密文里是由三部分組成的,即:
目前常用的是當id為1時,使用md5加密,id為5,采用SHA256進行加密,id為6采用SHA512進行加密。
分析上面的函數,可看出我們的shadow密碼中,直接把 當做salt參數帶入進行crypt加密。
那好,我們可以寫個簡短的代碼進行試驗:

保存后執行gcc passwd.c -lcrypt -o passwd

編譯成功后運行./passwd root 123
其中./passwd是生成的命令,root是我們用來測試的賬戶,123是測試系統中root用戶的密碼,執行的結果是:

可見,我們得到了和系統shadow文件下相同結果的密文。


根據我們的運行結果我們可以看到,在root用戶的shadow中,他的salt是
我們之前也是用這個salt來進行加密匹配的。但是,問題是:這個salt到底是怎么來的??

還是分析標准的passwd.c,
在passwd.c中,找到了生成salt的函數:crypt_make_salt

除了一大段條件判斷語句,其實最重要的只有一句gensalt(salt_len)。
看看gensalt的定義:

哦,原來神秘的salt只是某個的固定長度的隨機的可見的字符串而已。
每次改寫密碼時,都會再隨機生成一個這樣的salt。而用戶登入時,會拿用戶登入的明文密碼經過上述演示的步驟生成密文后和shadow里的密碼域進行比較。


有了上述的分析,要暴利破解linux下的口令也不是什么問題,但前提是你有機會拿到shadow文件,這個前提條件貌似很難。
本文只是篇技術分析文章,沒有其它任何初衷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM