来自 mkpasswd 的 SHA512 加盐哈希与在线版本不匹配

A. *_* Au 7 password encryption hashsum shadow

我对存储在 Linux (Ubuntu) /etc/shadow 下的哈希 (ASCII) 代码感到困惑。

假设一个案例,让密码为'test', salt 为'Zem197T4'

通过运行以下命令,

$ mkpasswd -m SHA-512 test Zem197T4
Run Code Online (Sandbox Code Playgroud)

生成一长串 ASCII 字符(这实际上是 Linux 在 /etc/shadow 中的存储方式)

$6$Zem197T4$oCUr0iMuvRJnMqk3FFi72KWuLAcKU.ydjfMvuXAHgpzNtijJFrGv80tifR1ySJWsb4sdPJqxzCLwUFkX6FKVZ0
Run Code Online (Sandbox Code Playgroud)

使用在线 SHA-512 生成器时(例如 http://www.insidepro.com/hashes.php?lang=eng)时,生成的是一些十六进制代码,如下所示:

选项1)密码+盐

8d4b73598280019ef818e44eb4493c661b871bf758663d52907c762f649fe3355f698ccabb3b0c59e44f1f6db06ef4690c16a2682382617c6121925082613fe2
Run Code Online (Sandbox Code Playgroud)

选项2)盐+密码

b0197333c018b3b26856473296fcb8637c4f58ab7f4ee2d6868919162fa6a61c8ba93824019aa158e62ccf611c829026b168fc4bf90b2e6b63c0f617198006c2
Run Code Online (Sandbox Code Playgroud)

我相信这些十六进制代码应该与 mkpasswd 生成的 ascii 代码“相同”。但是它们之间有什么关系呢?

希望有人能指教我吗?

LeS*_*cky 8

在Ubuntu / Debian的mkpasswd是包的一部分的whois和实施mkpasswd.c其为实际上只是围绕着一个复杂的包装crypt()在glibc的功能中声明unistd.h。crypt() 有两个参数 password 和 salt。在这种情况下,密码是“test”,SHA-512 散列(请参阅SHA-crypt)的盐前面加上“$6$”,因此将“$6$Zem197T4”传递给 crypt()。

也许你注意到哪个-R选项mkpasswd决定了轮数。在文档中,您会发现默认值为 5000 轮。这是为什么结果永远不会等于 salt 和 password 的简单串联的第一个提示,它不是只散列一次。实际上,如果您通过,-R 5000您会得到相同的结果。在这种情况下,“$6$rounds=5000$Zem197T4”被传递给 crypt() 并且 glibc(这是 Debian/Ubuntu 的 libc)中的实现从中提取方法和轮数。

crypt() 内部发生的事情比仅计算单个散列更复杂,结果最终是 base64 编码的。这就是为什么您显示的结果在最后一个 '$' 之后包含各种字符,而不仅仅是 [0-9a-f] ,如 SHA-512 哈希的典型十六进制字符串。该算法在已经提到的SHA-Crypt文档中有详细描述。