登录时如何比较MD5哈希值?

时间:2018-10-13 13:35:40

标签: linux cryptography md5

Linux发行版(例如CentOS(v6.3,即))正在使用特定的启动管理器,例如“ 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
  • 你好将被翻译成$1$H8Uz30$LwAkSMZBYC07zJbx3lIVa1哈希 grub.conf中的密码为$1$95Uz30$X/u7PX4F5GtEOsMguDDq10,即 登录尝试失败。

2 个答案:

答案 0 :(得分:1)

哈希

正如您所说,用户在设置密码时输入的密码将存储为哈希值。好的hash function是:

  • 无法还原
  • 耐碰撞(很难找到两个输入,导致输出相同)
  • 但是如果给出相同的输入,总是产生相同的输出。

假设您的操作系统使用md5,并以密码示例您好为例。 你好的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

其中

此格式并非专用于GRUB,/etc/passwd/etc/shadow(请参阅shadow password)中的密码以相同的方式存储。

答案 1 :(得分:0)

  

假定MD5是一种单向加密方法,并且加密相同的字符串将始终给出新生成的字符串。

哈希函数是:

  • 单向功能
  • 是幂等的:相同的输入产生相同的输出,而不是新创建的字符串
  • 您不能通过数学函数(仅通过蛮力攻击)从输出哈希开始取回输入密码

操作系统将提供的哈希与存储的相同密码的哈希进行比较,以检查其正确性。