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

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

對於 PAM 您只須要作:linux

  • 對您的密碼採用不一樣於 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文件,這個前提條件貌似很難。
本文只是篇技術分析文章,沒有其它任何初衷。code

相關文章
相關標籤/搜索