CentOS(即 v6.3)等 Linux 发行版使用特定的启动管理器,例如“GRUB”,其中包含一个 .conf 文件,您可以在其中编辑您的用户信息,例如您的密码等。
密码必须使用 MD5 加密(即:密码 --md5 kw485/fgf$&e),这有点令人困惑。
假设MD5是一种单向加密方式,加密同一个字符串总会得到一个新生成的字符串。
系统如何比较这两个密码,因为它们永远不会匹配?
这是一个例子:
grub> md5crypt
md5crypt
Password: hello
hello
Encrypted: $1$95Uz30$X/u7PX4F5GtEOsMguDDq10
grub> md5crypt
md5crypt
Password: hello
hello
Encrypted: $1$H8Uz30$LwAkSMZBYC07zJbx3lIVa1
如您所见,我们插入了相同的字符串并得到了两个不同的结果,假设这就是登录场景应该发生的方式,例如:
$ login user
password : hello
- hello 将被翻译成
$1$H8Uz30$LwAkSMZBYC07zJbx3lIVa1
散列 grub.conf 中的密码是$1$95Uz30$X/u7PX4F5GtEOsMguDDq10
登录尝试失败。
最佳答案
哈希
如您所说,用户在设置密码时输入的密码存储为哈希值。不错hash function是:
- 不可能恢复
- 抗冲突(很难找到两个输入,导致相同的输出)
- 但如果给定相同的输入,则总是产生相同的输出。
假设您的操作系统使用 md5 并以您的密码为例 hello。 hello 的 md5 散列是
echo -n hello | md5sum
5d41402abc4b2a76b9719d911017c592
因此操作系统将存储 5d41402abc4b2a76b9719d911017c592
如果用户再次登录,操作系统将询问他的密码,并使用相同的函数再次对他的输入进行哈希处理,在我们的示例中为 md5。 如果输入的密码正确,则哈希匹配。因此,操作系统知道输入了正确的密码,而实际上并不知道密码。
但是 5d414...
并不是 GRUB 显示给您的字符串,因为实际上它要复杂一些。
盐
假设攻击者获取了您密码的哈希值。 为了防止攻击者获得您的真实密码,操作系统通常会在计算哈希值之前为您的密码添加一个随机值。此值称为 salt ,它以未加密的形式与用户密码的哈希一起存储。盐渍防precomputation attacks ,攻击者会预先计算一个常用密码列表,存储哈希值,然后简单地将窃取的哈希值与该列表进行比较。 但是加盐并不能阻止攻击者暴力破解您的密码,方法是尝试将可能的密码列表与加盐值一起作为散列函数的输入,并将结果与窃取的散列进行比较。
因此在您的示例中,您第一次输入 hello 时,GRUB 将加盐 95Uz30
添加到您的密码中
openssl passwd -1 -salt 95Uz30 hello
$1$95Uz30$X/u7PX4F5GtEOsMguDDq10
生成的字符串正是 GRUB 向您显示的内容,但它不仅仅是散列,它是
$x$salt$hash
在哪里
- x 是使用的散列函数,1:md5,更完整的列表参见示例 Do all Linux distributions use the same cryptographic hash function?
- salt 是使用的盐值,这里:
95Uz30
- 而hash就是得到的哈希值
此格式并非特定于 GRUB,/etc/passwd
或 /etc/shadow
(请参阅 shadow password)中的密码以相同的方式存储。
关于linux - 如何在登录时比较 MD5 哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52793502/