我有一个在 Web 应用程序中使用 md5 哈希来生成哈希的字符串。我也有哈希。但是字符串的 md5 与哈希不匹配,所以我猜想其中涉及盐。有没有什么软件可以帮助我确定盐?
答案1
在标准散列函数(例如 /etc/shadow 中的 UNIX 密码)中,盐存储为散列的一部分。
将存储的哈希值作为盐传递,您应该会得到正确的结果。
/etc/shadow 中的哈希密码值实际上是一个以 $ 分隔的记录。例如,我们有密码“blarg”的哈希值:
$1$KfcI/JTQ$b5VTf4i9Mnf6QFgLuVZNM0
有三个字段以 $ 分隔,分别是
- 哈希函数(本例中为“1”,代表 MD5)
- 盐(即“KfcI/JTQ”)
- 哈希值(即“b5VTf4i9Mnf6QFgLuVZNM0”)
如果多次使用 mkpasswd,哈希值将会改变。
$ mkpasswd -m md5 blarg
$1$Gst52IWk$8ARVeSlpkcZOlyKV10Slu/
$ mkpasswd -m md5 blarg
$1$JeqRviA/$GnH/AvGnZEG9wLfJjiaAt1
但是,通过传入上面哈希值的盐值(即第二个字段),我们可以将其与原始哈希值进行匹配:
$ mkpasswd -m md5 -S KfcI/JTQ blarg
$1$KfcI/JTQ$b5VTf4i9Mnf6QFgLuVZNM0
您还可以传入整个密码哈希(尽管省略了哈希函数)。
$ mkpasswd -m md5 -S KfcI/JTQ$b5VTf4i9Mnf6QFgLuVZNM0 blarg
$1$KfcI/JTQ$b5VTf4i9Mnf6QFgLuVZNM0
在 Linux 上,哈希类型可以在 /etc/login.defs 中控制。更改时请务必小心,否则您可能会完全无法进入系统。我建议仔细阅读手册页,特别是查看标题 MD5_CRYPT_ENAB 和 ENCRYPT_METHOD。