mkpasswd 的 SHA512 加鹽雜湊與線上版本不匹配

mkpasswd 的 SHA512 加鹽雜湊與線上版本不匹配

我對 Linux (Ubuntu) /etc/shadow 下儲存的哈希 (ASCII) 程式碼感到困惑。

假設一個案例,設密碼為'測試', 鹽為'Zem197T4'

透過運行以下命令,

$ mkpasswd -m SHA-512 test Zem197T4

產生一長串 ASCII 字元(這實際上是 Linux 在 /etc/shadow 中的儲存方式)

$6$Zem197T4$oCUr0iMuvRJnMqk3FFi72KWuLAcKU.ydjfMvuXAHgpzNtijJFrGv80tifR1ySJWsb4sdPJqxzCLwUFkX6FKVZ0

當使用線上 SHA-512 產生器時(例如http://www.insidepro.com/hashes.php?lang=eng),產生的是一些十六進位代碼,如下所示:

選項1)密碼+鹽

8d4b73598280019ef818e44eb4493c661b871bf758663d52907c762f649fe3355f698ccabb3b0c59e44f1f6db06ef4690c16a2682382617c6121925082613fe2

選項 2) 鹽+密碼

b0197333c018b3b26856473296fcb8637c4f58ab7f4ee2d6868919162fa6a61c8ba93824019aa158e62ccf611c829026b168fc4bf90b2e6b63c0f617198006c2

我相信這些十六進位代碼應該與 mkpasswd 產生的 ascii 代碼「相同」。但它們有什麼關係呢?

希望有人能啟發我嗎?

答案1

在 Ubuntu/Debian 上mkpasswd是軟體包的一部分誰是並在其中實現mkpasswd.c,實際上只是對crypt()glibc 中聲明的函數進行了複雜的包裝unistd.h。 crypt() 有兩個參數:密碼和鹽。在本例中,密碼為“test”,鹽前綴為 SHA-512 雜湊值“$6$”(請參閱SHA加密) 因此「$6$Zem197T4」傳給 crypt()。

也許您注意到其中-R的選項mkpasswd決定了輪數。在文件中,您會發現預設值為 5000 發。這是為什麼結果永遠不會等於鹽和密碼的簡單串聯的第一個提示,它不僅僅被散列一次。事實上,如果你通過了,-R 5000你會得到同樣的結果。在這種情況下,將「$6$rounds=5000$Zem197T4」傳遞給 crypt(),glibc(Debian/Ubuntu 的 libc)中的實作從中提取方法和輪數。

crypt() 內部發生的事情比僅僅計算單一雜湊更複雜,結果最終是 Base64 編碼的。這就是為什麼您顯示的結果在最後一個“$”之後包含所有類型的字符,而不僅僅是 SHA-512 哈希的典型十六進製字串中的 [0-9a-f]。該演算法在已經提到的中有詳細描述SHA 加密文件.

答案2

使用加鹽密碼的整個想法是,每次為同一密碼產生雜湊值時,都會得到不同的結果。這是為了避免彩虹表出現問題。

假設您的一個使用者使用弱密碼,例如 123456,您的 /etc/shadow 就會被揭露。現在邪惡的駭客所要做的就是使用彩虹表找出弱密碼並在其他位置再次使用它。

相關內容