在Linux系统中,使用MD5哈希存储密码。为什么“盐”的使用可以更多地保护系统?特别是,我想明确以下两个
/etc/shadow
。例如,用户A具有用户salt s1并生成h1; h1 = md5(password.s1);
。
下一次,它使用salt s2,系统必须生成不同的散列h2 = md5(password.s2)
。由于h1不等于h2,系统如何验证用户?
答案 0 :(得分:13)
如你所知,MD5是一个哈希,所以如果给它一个输入,比如'PASSWORD',你会得到一个独特的(希望 - 但是这些天MD5有冲突)输出,比如'3DE2AF ......'。
现在,正如你所知道的那样,直到有人认为这很难直接反转...等等,为什么我不能预先生成所有可能的哈希值组合,直到我可以反转哈希值。这称为rainbow table。
salt的目的是将任意随机数据添加到正在进行哈希处理的字符串中,这样就可以增加哈希输入的长度。这意味着一般的彩虹表,只能反转输入到哈希的密码将无法正常工作。当然,彩虹表只是反向查找,你可以简单地生成一个彩虹表来补偿所有可能的密码+盐输出。这是长度增加的地方;由于反转哈希的性质,为非常长的哈希输入生成反转的磁盘空间很快变得不可行。 6-8个字符的字母数字彩虹表已经是几千兆字节;增加长度和字符类,你开始以10GB的倍数说话。
当然,如果你正在用“密码”腌制而你用“密码”进行抄写,那么你就不会更加安全地使用“PASSWORDPASSWORD”,因此选择盐也很重要。理想情况下,您应该使用随机盐和每个散列字符串,但当然,您需要知道它是什么。一种常见的技术是从用户名或本案例独有的其他属性中导出salt。添加任意数据本身并不有用;具有用户确定的盐数据现在增加了额外的复杂性,这意味着需要彩虹表以及对每个用户的专门搜索。你越难以实现这一点,就需要越多的计算能力。这就是战斗的地方。
然而,有一些现代技术。我不是专家,所以我不能告诉你这些是多么安全,但值得一提。这个概念是慢哈希。基本上,通过复合散列函数,您需要花费一些时间来计算每个散列。因此,每个用户检查密码的能力现在为您要检查的每个密码添加了一定的时间。如果你是暴力破解,那就是坏消息(tm)。类似地,如果系统设计得很好,如果没有快捷方式(可能等同于弱点),那么为慢速哈希函数生成彩虹表也需要一段时间。
修改此处提供更多详细信息。有关此问题的第一个示例,请参阅crypt()
。 @CodeInChaos引用PBKDF2作为PKCS#5的一部分。更新的发展是scrypt。
正如我所说,我不是专家密码分析师。在后一个例子中,我对其适用性没有特别的专业知识,我只是告诉你事情的发展方向。
编辑2 澄清了我写的盐 - 我想我之前围绕磁盘空间的关键问题跳舞。
答案 1 :(得分:5)
您可以通过暴力破解简单的哈希算法。
如果您使用密码的常用词,则某些预建表(如rainbow ones)可能包含它们。这就是大多数算法多次调用哈希函数的原因:
md5(md5(md5(password)));
使用salt为生成的密码提供了更多的随机性,从而减少了猜测。它包括在过程中添加一段随机字符串
md5(md5(md5(password+string)+string)+string);
答案 2 :(得分:2)
一个原因可能是,如果两个人在不知不觉中使用相同的密码,他们将生成相同的MD5。其中一个可以看到/ etc / shadow并猜测其他人的密码。
现在,在每个密码中添加了salt,即使相同的密码也会产生不同的哈希值。
答案 3 :(得分:0)
加密数据时,bruce-force attacks和rainbow attacks仍会受到攻击。在salting中,在加密数据的末尾添加一些额外的位。因此攻击者无法正确获取原始数据。