Password

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

  • May 17, 2020

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

舉一個假設的例子,讓密碼是**’test’,鹽是‘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 程式碼“相同”。但是它們有什麼關係呢?

希望有人能啟發我嗎?

在 Ubuntu/Debianmkpasswd上是包whois的一部分並在mkpasswd.c其中實現,實際上它只是一個複雜的包裝器,圍繞crypt()在 .glibc 中聲明的函式unistd.h。crypt() 接受兩個參數密碼和鹽。在這種情況下,密碼是“測試”,鹽前面是“ $ 6 $ “對於 SHA-512 雜湊(參見SHA-crypt)所以” $ 6 $ Zem197T4" 被傳遞給 crypt()。

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

crypt() 內部發生的事情比僅僅計算單個雜湊要復雜得多,結果最終是 base64 編碼的。這就是為什麼您顯示的結果在最後一個“$”之後包含各種字元,而不僅僅是

$$ 0-9a-f $$就像 SHA-512 雜湊的典型十六進製字元串一樣。該算法在已經提到的SHA-Crypt文件中有詳細描述。

引用自:https://unix.stackexchange.com/questions/160246