系统如何知道例如在svn环境中,如果输入的密码正确,则使用DES crypt散列将帐户存储在.passwd中。
纠正我如果我错了,但如果我转换某个密码,例如“测试”使用DES哈希,因为盐有很多可能性。系统(我想象它只是比较生成的哈希值)比知道输入的密码是否正确?
答案 0 :(得分:6)
这已得到很好的回答,但我想我会在实际例子中添加一些额外的信息。
在大多数现代系统中,密码实际存储在影子文件/ 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哈希值,并且它应与shadow文件中的上述内容完全相同。上述命令中的-1表示MD5哈希值。
答案 1 :(得分:5)
可以说,盐以明文形式存储。它可以防止某些类型的攻击,但盐只是在散列之前连接到密码的一些公共(尽管是站点本地)信息。
因此,让我们说您的密码是“测试”,并且您在Cyberdyne工作。管理员可能已经确定盐将是“Cyber”,因此通过DES进行哈希处理的字符串是“Cybertest”。
当您输入密码“test”时,它会在应用DES之前再次添加到本地salt中,因此salting + hashing的结果与存储的密码匹配。
如果聪明人(或gal)已经构建了rainbow table所有词典单词的DES签名,他(或她)将不会在其中找到您的哈希密码,因为加密版本不是DES(测试),它是DES(cybertest)。