自从我制作需要用户使用用户名和密码登录的网站以来,我一直通过将密码存储在我的数据库中并使用盐短语进行哈希处理来保持密码的安全。好吧,就在最近,我读到使用单个静态盐字是不好的做法。相反,您应该为每个用户使用随机盐。
我理解为每个用户生成一个随机盐字。但我的问题是,如果您还必须将随机盐存储在数据库中,以便以后可以使用它来交叉引用它,以检查用户在登录时输入的密码。如果用户名和密码从您的数据库中被盗,那么他们是否也可以访问随机盐值?似乎额外的安全层并没有真正为等式增加太多。
还是我对这一切都错了?
自从我制作需要用户使用用户名和密码登录的网站以来,我一直通过将密码存储在我的数据库中并使用盐短语进行哈希处理来保持密码的安全。好吧,就在最近,我读到使用单个静态盐字是不好的做法。相反,您应该为每个用户使用随机盐。
我理解为每个用户生成一个随机盐字。但我的问题是,如果您还必须将随机盐存储在数据库中,以便以后可以使用它来交叉引用它,以检查用户在登录时输入的密码。如果用户名和密码从您的数据库中被盗,那么他们是否也可以访问随机盐值?似乎额外的安全层并没有真正为等式增加太多。
还是我对这一切都错了?
它确实增加了一件重要的事情。如果他们窃取数据库,他们将拥有用户名、每个用户的随机盐和散列密码。但是他们仍然没有原始密码。要反转哈希,他们通常必须为每个用户做大量的单独工作。
没有任何盐(LinkedIn 了解到,这是一个非常糟糕的主意),攻击者可以使用预先存在的彩虹表,并且没有针对从表中受益的散列的每个用户工作。即使哈希表中没有任何部分,它们也可以合并工作(例如,如果用户有两个帐户具有相同的晦涩密码)。
使用每个站点的盐,他们可以为站点生成彩虹表,并且仍然在用户之间共享工作。
请记住,如果他们确实破解了用户的密码,除了能够登录您的站点之外,他们可能还可以登录用户使用的其他站点。
它为您做的是迫使他们为每个用户生成一个彩虹表,而不是为整个站点生成一个彩虹表来破解您的密码。这也意味着他们不能只用谷歌搜索你的哈希值,也就是“终极彩虹表”。它将破解命题变成了一项更加困难的任务。
谷歌“5f4dcc3b5aa765d61d8327deb882cf99”。看看你得到了什么(提示它是密码的 MD5 哈希,并且有数千个结果)。
用不同的盐对每个密码进行散列比使用一种盐更好,但一种盐总比没有盐好。
salt用于使每个用户的密码处理不同。否则,获得数据库副本的攻击者(您存储密码哈希正是因为您设想到这种情况)可以优化他的搜索并攻击所有密码,其努力与破解单个密码(彩虹表,如任何其他预先计算的表都是这个概念的体现)。至少对于每个用户的盐,攻击者将为他想要破解的每个密码付出全部的暴力努力。
(理想情况下,您使用每个用户的盐,每当用户更改密码时,您也会更改它。所以它确实是每个密码的盐。)
盐只是故事的一半;您还希望散列机制变慢(以可配置的方式,但仍然非常慢)。一个简单的哈希太快了,攻击者每秒可以计算数十亿个。
使用 bcrypt。Bcrypt 实现处理盐的生成和使用,并且可以根据需要使 bcrypt 变慢。
单独加盐密码有助于防止利用离线预计算步骤的攻击,例如时间-内存权衡(raibow 表)。这迫使攻击者暴力破解哈希以恢复密码。这篇博文详细介绍了几种密码存储策略,从最不安全到最安全。