为什么在数据库

时间:2018-05-22 05:53:58

标签: security encryption hash

我目前正在开发一个需要存储哈希密码的系统。 我正在使用cryptographically secure pseudo-random number generator (CSPRNG)来生成salt。我正在使用PBKDF2来散列附加了salt的密码,该密码最终将存储在数据库中。

我没有得到的是为什么我甚至需要将salthashed password一起存储在数据库中。我确实理解salt的目的。它显着降低了成功rainbow and lookup攻击的可能性。具有相同密码的用户也将在数据库中存储不同的哈希值。

那么需要将盐存储在数据库中的哪个位置呢?

更新

  

我之前应该提到这一点,但那次它没有点击我。这里的password永远不会由用户提供。这是出于我们的内部目的。我们只需要在用户第一次访问我们的网站时生成它,稍后我们将在响应中发送此Hashed密码。

2 个答案:

答案 0 :(得分:2)

如果我们不加盐怎么办?

此时您已经明白,如果您自己使用Password1(没有盐),那么每次散列它时,您都会得到完全相同的结果。现在,让我们假装你有1000个用户,其中有25个,其中25个使用相同的密码。这25个哈希将完全相同。一旦攻击者获得对您的数据库的访问权并发现哈希70ccd9007338d6d81dd3b6271621b9cf9a97ea00转换为Password1,他们就可以立即访问25个人的帐户。这意味着彩虹表攻击将允许他更快地访问更多帐户。

如果我们做盐怎么办?

通过在Password1的值附加盐,您将大大改变哈希值。每个用户都应该有自己的盐。这意味着,即使您的所有1000个用户都使用Password1,所有1000个哈希值也会完全不同。在真实世界中,这意味着拥有相同密码的1000个用户中的25个将具有不同的哈希值。但是,这也意味着攻击者必须同时对一个密码进行攻击,而不仅仅是彩虹表示哈希并希望最好。

但为什么要储存盐?

如果没有salt,您将无法在用户输入密码时重新创建哈希 - 这意味着用户永远无法再次登录并访问其帐户。通过存储密码,您可以允许用户输入他们的密码,然后在他们的帐户上运行查找,将盐附加到他们的输入,并散列整个内容;如果它匹配数据库中存储的哈希,你就得到了正确的密码!如果你从不存储这个盐,你永远不能重新创建哈希值!

我希望这可以解释得更好一些,如果你有任何意见,请随时提出

答案 1 :(得分:1)

PBKDF2的输出取决于盐。如果您不存储盐,则无法确定密码是否正确。

使用密码哈希存储salt是安全的,只需确保每个密码的盐都是随机的。