天天看點

RHCSA&RHCE(RHCE7)學習深入--shadow密碼的加密方式

1) 檢視shadow檔案的内容

cat /etc/shadow

root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.:14838:0:99999:7:::

其格式為:

{使用者名}:{加密後的密碼密碼}:{密碼最後修改時間距原點(1970-1-1)的天數}:{密碼最小修改間隔(防止修改密碼,如果時限未到,将恢複至舊密碼):{密碼最大修改間隔}:{密碼失效前的警告天數}:{賬戶不活動天數}:{賬号失效天數}:{保留}

【注】:shadow檔案為可讀檔案,普通使用者沒有讀寫權限,超級使用者擁有讀寫權限。如果密碼字元串為*,則表示系統使用者不能被登入;如果字元串為!,則表示使用者名被禁用;如果字元串為空,則表示沒有密碼。

我們可以使用passwd –d 使用者名 清空一個使用者的密碼密碼。

2) 解析shadow檔案中密碼字元串的内容

對于示例的密碼域$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.,我們參考了linux标準源檔案passwd.c,在其中的pw_encrypt函數中找到了加密方法。

我們發現所謂的加密算法,其實就是用明文密碼和一個叫salt的東西通過函數crypt()完成加密。

而所謂的密碼域密文也是由三部分組成的,即:$id$salt$encrypted。

【注】: 

id為1時,采用md5進行加密;

id為5時,采用SHA256進行加密;

id為6時,采用SHA512進行加密。

3) 加密參數salt的由來

在我們的示例密碼域中salt為Bg1H/4mz,那麼它又是如何來的?

我們還是從标準源檔案passwd.c中查找答案。在passwd.c中,我們找到了與salt相關的函數crypt_make_salt。

在函數crypt_make_salt中出現了很多的判斷條件來選擇以何種方式加密(通過id值來判斷),但其中對我們最重要的一條語句是gensalt(salt_len)。

我們繼續檢視了函數static char *gensalt (unsigned int salt_size),才發現原來神秘無比的salt參數隻是某個固定長度的随機字元串而已。

4) 最終結論

在我們每次改寫密碼時,都會随機生成一個這樣的salt。我們登入時輸入的明文密碼經過上述的演化後與shadow裡的密碼域進行字元串比較,以此來判斷是否允許使用者登入。

5) 手工生成shadow密碼

使用python的crypt子產品:

# python -c 'import crypt;pw="123456";salt="$6$Ev74UfEC$";print(crypt.crypt(pw,salt))'

$6$Ev74UfEC$cml/xwJiYhL9MAN8sLdbQXZLmdjJ3zDb0NCMfVJILsEJO9AQPQNdH.CY9L550/9nwHyqQY3zZIVxTfARUN6NQ.

# echo “123456” | passwd --stdin gly

# grep gly /etc/shadow

gly:$6$Ev74UfEC$cml/xwJiYhL9MAN8sLdbQXZLmdjJ3zDb0NCMfVJILsEJO9AQPQNdH.CY9L550/9nwHyqQY3zZIVxTfARUN6NQ.:17915:0:99999:7:::

繼續閱讀