系统如何知道例如在 svn 环境中,如果输入的密码正确,则该帐户使用 DES 加密散列存储在 .passwd 中。
纠正我如果我错了,但如果我使用 DES 哈希转换某个密码,例如“test”,因为盐有很多可能性。系统(我想象它只是比较生成的哈希)如何知道输入的密码是正确的?
可以这么说,盐是以明文形式存储的。它可以防止某些类型的攻击,但盐只是一些公共(尽管是站点本地)信息,在散列之前与密码相连。
因此,假设您的密码是“测试”并且您在 Cyberdyne 工作。管理员可能已决定 salt 为“Cyber”,因此通过 DES 进行散列处理的字符串为“Cybertest”。
输入密码“test”时,会在应用DES之前再次添加到本地salt中,使salting+hashing的结果与存储的密码一致。
如果一个聪明人(或女孩)已经建立了所有字典单词的 DES 签名的彩虹表,他(或她)不会在其中找到您的哈希密码,因为加密版本不是 DES(测试),它是 DES (网络测试)。
这已经得到了很好的回答,但只是想我会用一个实际的例子添加一些额外的信息。
在大多数现代系统上,密码实际上存储在影子文件 /etc/shadow 中(只能由 root 读取),而不是 /etc/passwd。作为一个简单的练习来了解它实际上是如何工作的,请尝试以下操作: 作为 root,从影子文件中查看用户记录中的行:
cat /etc/shadow | grep yourusername
你会看到这样的东西:
yourusername:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::
在您的用户名后面有 1 美元。这表明它是一个 MD5 散列。之后是另一个 $,然后(在这种情况下)TrOIigLp
接着是另一个 $。TrOIigLp 是盐。之后是散列密码,在本例中是使用盐进行散列的PUHL00kS5UY3CMVaiC0/g0
。
现在,您可以使用 openssl 使用相同的盐对您的密码进行哈希处理,如下所示:
openssl passwd -1 -salt TrOIigLp
出现提示时输入您的用户密码,openssl 命令应该使用提供的 salt 计算 MD5 哈希,并且它应该与上述影子文件中的完全相同。上述命令中的 -1 用于 MD5 散列。