我目前正在开发一个需要存储哈希密码的系统。
我正在使用cryptographically secure pseudo-random number generator
(CSPRNG)来生成salt
。我正在使用PBKDF2
来散列附加了salt
的密码,该密码最终将存储在数据库中。
我没有得到的是为什么我甚至需要将salt
和hashed password
一起存储在数据库中。我确实理解salt
的目的。它显着降低了成功rainbow and lookup
攻击的可能性。具有相同密码的用户也将在数据库中存储不同的哈希值。
那么需要将盐存储在数据库中的哪个位置呢?
更新
我之前应该提到这一点,但那次它没有点击我。这里的
password
永远不会由用户提供。这是出于我们的内部目的。我们只需要在用户第一次访问我们的网站时生成它,稍后我们将在响应中发送此Hashed
密码。
答案 0 :(得分:2)
此时您已经明白,如果您自己使用Password1
(没有盐),那么每次散列它时,您都会得到完全相同的结果。现在,让我们假装你有1000个用户,其中有25个,其中25个使用相同的密码。这25个哈希将完全相同。一旦攻击者获得对您的数据库的访问权并发现哈希70ccd9007338d6d81dd3b6271621b9cf9a97ea00
转换为Password1
,他们就可以立即访问25个人的帐户。这意味着彩虹表攻击将允许他更快地访问更多帐户。
通过在Password1
的值附加盐,您将大大改变哈希值。每个用户都应该有自己的盐。这意味着,即使您的所有1000个用户都使用Password1
,所有1000个哈希值也会完全不同。在真实世界中,这意味着拥有相同密码的1000个用户中的25个将具有不同的哈希值。但是,这也意味着攻击者必须同时对一个密码进行攻击,而不仅仅是彩虹表示哈希并希望最好。
如果没有salt,您将无法在用户输入密码时重新创建哈希 - 这意味着用户永远无法再次登录并访问其帐户。通过存储密码,您可以允许用户输入他们的密码,然后在他们的帐户上运行查找,将盐附加到他们的输入,并散列整个内容;如果它匹配数据库中存储的哈希,你就得到了正确的密码!如果你从不存储这个盐,你永远不能重新创建哈希值!
我希望这可以解释得更好一些,如果你有任何意见,请随时提出
答案 1 :(得分:1)
PBKDF2的输出取决于盐。如果您不存储盐,则无法确定密码是否正确。
使用密码哈希存储salt是安全的,只需确保每个密码的盐都是随机的。