kum*_*mo2 3 security encryption hash
我目前正在开发一个需要存储哈希密码的系统。我正在使用cryptographically secure pseudo-random number generator(CSPRNG)生成salt. 我正在使用 来PBKDF2哈希附加的密码,salt最终将存储在数据库中。
我不明白的是为什么我什至需要将salt与 一起存储hashed password在数据库中。我确实理解 的目的salt。它大大降低了攻击成功的机会rainbow and lookup。此外,具有相同密码的用户将在数据库中存储不同的哈希值。
那么哪里需要将盐存储在数据库中呢?
更新:
我应该早点提到这一点,但那次我并没有注意到。这里
password永远不会由用户提供。这是为了我们的内部目的。我们只需要在用户第一次访问我们的网站时生成它,稍后我们将Hashed在响应中发送此密码。
此时您已经了解,如果您Password1单独使用(不加盐),那么每次对其进行哈希处理时,您都会得到完全相同的结果。现在,假设您有 1000 个用户,这 1000 个用户中,有 25 个使用相同的密码。这 25 个哈希值将完全相同。一旦攻击者获得对您数据库的访问权限并发现哈希70ccd9007338d6d81dd3b6271621b9cf9a97ea00值转换为Password1,他们将立即获得对 25 个人帐户的访问权限。这意味着彩虹表攻击将使他能够更快地访问更多帐户。
通过将盐附加到Password1您的值上,您将极大地改变哈希值。每个用户都应该有自己的盐。这意味着即使您的所有 1000 个用户都使用Password1,所有 1000 个哈希值也会完全不同。在现实世界中,这意味着 1000 个具有完全相同密码的用户中的 25 个将具有不同的哈希值。然而,这也意味着攻击者必须一次对一个密码进行攻击,而不仅仅是彩虹表哈希值并希望得到最好的结果。
如果没有盐,当用户输入密码时,您将无法重新创建哈希 - 这意味着用户永远无法再次登录并访问他们的帐户。通过存储密码,您可以允许用户输入密码,然后对他们的帐户运行查找,将盐附加到他们的输入中,并对整个内容进行哈希处理;如果它与数据库中存储的哈希值匹配,那么您就获得了正确的密码!如果你从不存储这个盐,你就永远无法重新创建哈希!
我希望这能更好地解释,并且一如既往,如果您有任何意见,请随时询问