代码之家  ›  专栏  ›  技术社区  ›  kumarmo2

为什么要在数据库中存储salt和哈希密码?

  •  1
  • kumarmo2  · 技术社区  · 6 年前

    我目前正在一个系统上工作,我需要在其中存储哈希密码。 我正在使用 cryptographically secure pseudo-random number generator (CSPRNG) 用于生成 salt . 我用的是 PBKDF2 用于哈希附加的密码 最后将存储在数据库中。

    我没有得到的是为什么我甚至需要存储 以及 hashed password 在数据库中。我确实理解 . 它大大降低了成功的机会 rainbow and lookup 攻击。同样,具有相同密码的用户将在数据库中存储不同的哈希值。

    那么,在数据库中存储盐的需求在哪里呢?

    更新:

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Horkrine Charles Landau    6 年前

    如果我们不加盐怎么办?

    你已经明白如果你使用 Password1 就其本身而言(不含盐),那么每次你将其散列时,都会得到完全相同的结果。现在,假设您有1000个用户,其中25个用户使用相同的密码。这25个哈希将是 完全一样 . 一旦攻击者获得对数据库的访问权并找到散列值 70ccd9007338d6d81dd3b6271621b9cf9a97ea00 转换为 密码1 他们很快就能进入25个人的账户。这意味着彩虹表攻击可以让他更快地访问更多的帐户。

    如果我们吃盐怎么办?

    把盐加到 密码1 您将显著更改哈希值。每个用户都应该有自己的盐。这意味着即使1000个用户都在使用 密码1 ,所有1000个散列将完全不同。在现实世界中,这意味着1000个拥有相同密码的用户中的25个将拥有不同的哈希值。然而,这也意味着攻击者将不得不一次对一个密码进行攻击,而不仅仅是彩虹牌的散列并希望得到最好的密码。

    但是我们为什么要储存盐呢?

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

    我希望这能解释得更好一点,如果你有什么意见,随时可以问。

        2
  •  1
  •   Luke Joshua Park    6 年前

    PBKdf2的产量取决于盐。如果您不存储盐,那么就无法确定密码是否正确。

    用密码散列存储salt是安全的,只需确保每个密码的salt都是随机的。