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