盐的作用是什么,它的作用是什么?
它是否提供了额外的字符,因此散列值会更独特?
答案 0 :(得分:0)
在数据库中存储密码时,通常使用加密哈希函数来存储哈希值,而不是存储密码。这个想法是直接存储密码会使访问数据库的任何人都很容易检索它。从理论上讲,反转哈希值(即计算上很复杂)来判断创建哈希值的密码是不可行的,但是为给定的密码生成哈希很简单,从而可以很容易地确认用户是否已输入只需匹配哈希值即可匹配密码。
要使此过程起作用,散列函数必须每次都返回相同的值。这是盐变得有用的地方 - 让我解释一下:
密码如何工作
想象一下,你有两个用户 - 爱丽丝和鲍勃。
Alice拥有密码' mypassword'。当Alice输入密码时,我计算此密码的SHA1哈希值并将其存储在数据库中。值是
SHA1('mypassword') = '91dfd9ddb4198affc5c194cd8ce6d338fde470e2'
鲍勃也有密码' mypassword'。当我计算并将其哈希值输入我的数据库时,它也将是
SHA1('mypassword') = '91dfd9ddb4198affc5c194cd8ce6d338fde470e2'
请注意,两个用户都将在我的数据库中存储相同的哈希:
USER HASH
Alice 91dfd9ddb4198affc5c194cd8ce6d338fde470e2
Bob 91dfd9ddb4198affc5c194cd8ce6d338fde470e2
我不需要在我的数据库中输入实际密码,因为每次Alice或Bob尝试登录时,我都会使用他们尝试过的密码,将哈希函数应用于该尝试密码,并将生成的哈希值与我的数据库进行匹配。如果哈希值与我的数据库中的哈希值匹配,我可以让用户进入。如果哈希值不匹配,我可以拒绝登录尝试。
这比存储mypassword'要好得多。在数据库中,因为乍一看,有权访问我的数据库的人无法轻易说出密码是什么。这是使用 加密哈希函数 的好处。到目前为止,盐或盐腌在这里不适用。
但是在这里使用哈希函数仍有两个常见问题:
如果Alice或其他知道Alice密码的攻击者进入我的数据库,很容易看出Alice和Bob的哈希值是相同的。她知道她的密码是' mypassword'并且鲍勃的哈希与她的哈希是一样的 - 这足以让人知道鲍勃的密码很可能也是“我的密码”'并试图访问他的帐户。
许多攻击者还使用了所谓的彩虹表'或者预先计算的哈希值列表来攻击密码系统。假设卡罗尔想要攻击我的系统。她已经浏览了字典并想出了一些常见的密码。她选择的一些密码是密码'和' mypassword'。在尝试攻击我的系统之前,她已将加密哈希函数应用于这些单词。在她的列表中,她的条目如下所示:
密码= 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
mypassword = 91dfd9ddb4198affc5c194cd8ce6d338fde470e2
如果Carol可以访问我的数据库,她可以立即将第二个条目中的哈希值与我数据库中Alice和Bob的哈希值相匹配。她现在知道她可以使用' mypassword'作为他们的密码并尝试进入我的系统。更糟糕的是,她可以尝试去访问其他系统(例如Alice的电子邮件帐户)并检查她是否有相同的密码。实际上,彩虹表通常是一个大文件,包含所有字符(有时是符号)的字母数字组合,直到一定长度和生成的哈希值。
盐和盐渍
Salting旨在通过极少的额外努力来防止上述两个问题。
当Alice和Bob更改密码时,我现在还会生成一个随机的双字符串,称为“盐”#。
对于爱丽丝来说,我的随机盐将是“aa'”。
对于鲍勃来说,我的随机盐将是' bb'。
现在,当用户设置密码时,我会在计算哈希值之前将salt添加到密码的末尾。因此,当Alice设置密码时,我会执行以下操作:
SHA1('mypasswordaa') = 8bbf177f836204a63ee9032311da9be3a8528fb8
当Bob设置密码时,我会执行以下操作:
SHA1('mypasswordbb') = d1958d2ce09379a32bcb651346f02f3a73819561
我将这些新的哈希值和salt存储在数据库中,如下所示:
USER SALT HASH
Alice aa 8bbf177f836204a63ee9032311da9be3a8528fb8
Bob bb d1958d2ce09379a32bcb651346f02f3a73819561
我仍然很容易检查用户是否输入了正确的密码。当Alice登录时,我需要做的就是查找她的盐并将其添加到输入密码的末尾,然后再生成新的哈希值。如果该哈希值匹配,则她输入了正确的密码。
但在考虑上述两个问题时,现在存在差异 -
尽管Alice和Bob拥有相同的密码,但您无法通过查看我的数据库来判断。这可以防止上述第一个问题。
Carol在上面生成的彩虹表不再有效。如果Carol想要对我的数据库生成哈希值,她现在需要返回并使用两个字符salt的每个组合生成密码的每个组合。这需要更多时间。我可以通过在密码和盐之间放置一个值(例如' +'或'&'或用户名)或增加我的长度来进一步保护自己免受此攻击盐串。
虽然用户可能直接从数据库中获取我的salt值,然后在最坏的情况下离开并使用它们来创建彩虹表,但是根本不使用salt就不那么安全了