在《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庫。python
__import__("crypt").crypt("password","$1$abcdefg$")
若是你不想本身設置指定的salt值,可使用crypt庫的mksalt函數自動生成,且提供md5,sha256,sha512全方位的支持。小程序