linux的shadow文件


在《Python絕技》這本書的第一個小程序首先展示了針對與unix系統中shadow文件密碼的暴力破解的能力,因為之前只是對shadow文件停留在保存了用戶密碼的階段,但並沒有詳細研究,所以周末兩天特地花時間好好研究了一下。 
1.passwd文件和shadow文件 
在unix早些時候是沒有/etc/shadow這個文件的。一個用戶的所有信息都只是保存在/etc/passwd文件中,加密后的用戶密碼保存在了passwd文件的第二個字段中。那么為什么要產生shadow文件呢? 
首先我們通過ls查看一下passwd文件的詳細權限: 
-rw-r--r-- 1 root root 1505 Mar 6 22:34 /etc/passwd 
可以看出每個用戶都是可讀的,那么這不就把用戶密碼暴露給任何人了么?雖然是加過密的,但是這樣也存在安全性問題。 
現在的文件權限是這樣的:(注意/usr/bin/passwd除了rwx權限外還有一個SetUID的s標識位) 
-rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd 
---------- 1 root root 964 Mar 6 22:34 /etc/shadow 
首先通過對shadow文件取消所有權限,保證了只有root才能對shadow文件進行讀寫(root是天神,沒有特殊說明任何文件都在root的管轄之下)。那么普通用戶修改密碼時肯定要對shadow文件進行更改的啊?通過/usr/bin/passwd的s位實現。 
普通用戶的修改密碼流程是這樣的: 
test用戶調用/usr/bin/passwd命令修改自己的密碼,因為passwd對任何用戶都是可執行的,而且s位規定所有可執行的用戶在執行這個命令時變身為root,所以此時test用戶拿着root的權限去讀寫shadow文件,當命令執行完成后變身結束,test變失去root權限。可以看出經過對shadow文件的分離,既保證了普通用戶對自己密碼的修改,也保證了普通用戶看不到加密后的密碼串提升了安全性。 
2.shadow文件的組成 
root:$1$abcdefg$Qp6zr7K0tHxV79N9cCLSc1:16866:0:99999:7::: 
帳號名稱 :root 
加密后的密碼:$1$abcdefg$Qp6zr7K0tHxV79N9cCLSc1 
上次修改密碼的日期:16866 
密碼不可被變更的天數:0 
密碼需要被重新變更的天數:99999(99999表示不需要變更) 
密碼變更前提前幾天警告 :7 
帳號失效日期 :無 
帳號取消日期 :無 
保留條目,目前沒用 
3.shadow文件的密碼部分 
shadow文件的密碼部分由三個部分組成,由'$'分割。 
以上面root用戶的密碼為例,按照'$'分割后分別是加密方式(1),salt值(abcdefg),加密后的密碼串(Qp6zr7K0tHxV79N9cCLSc1)。 
首先看第一個加密方式,目前加密方式有6種,最常見的只有3種: 
1:MD5加密,密文長度22 
5:SHA-256加密,密文長度43 
6:SHA-512加密,密文長度86 
4.手動生成password字串(測試於centos6.5) 
方法一:dovecot包中提供dovecotadm命令。 
比如:doveadm pw -s SHA512-CRYPT,其中s參數可選多種加密方式,比如SHA512-CRYPT,SHA256-CRYPT,MD5-CRYPT。 
方法二:openssl包中提供passwd子命令。 
比如openssl passwd -1,但是我發現只支持md5。 
方法三:默認的python中自帶crypt庫。

__import__("crypt").crypt("password","$1$abcdefg$") 
  • 1

如果你不想自己設置指定的salt值,可以使用crypt庫的mksalt函數自動生成,且提供md5,sha256,sha512全方位的支持。


免責聲明!

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



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