【问题标题】:Why to store salt along with hashed password in database为什么将盐与散列密码一起存储在数据库中
【发布时间】:2018-10-31 19:26:23
【问题描述】:

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

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

那么哪里需要将盐存储在数据库中?

更新:

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

【问题讨论】:

    标签: security encryption hash


    【解决方案1】:

    如果我们不加盐怎么办?

    此时您已经明白,如果您单独使用Password1(不加盐),那么每次对它进行哈希处理时,您都会得到完全相同的结果。现在,假设您有 1000 个用户,在这 1000 个用户中,有 25 个使用相同的密码。这 25 个哈希值将完全相同。一旦攻击者获得对您数据库的访问权并发现哈希 70ccd9007338d6d81dd3b6271621b9cf9a97ea00 转换为 Password1,他们将立即获得对 25 个人帐户的访问权。这意味着彩虹表攻击将允许他更快地访问更多帐户。

    如果我们加盐呢?

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

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

    没有盐,当用户输入密码时,您将无法重新创建哈希 - 这意味着用户永远无法再次登录并访问他们的帐户。通过存储密码,您可以允许用户输入他们的密码,然后您在他们的帐户上运行查找,将盐附加到他们的输入,并对整个事情进行哈希处理;如果它与存储在数据库中的哈希值匹配,那么您就获得了正确的密码!如果您从不存储此盐,则永远无法重新创建哈希!

    我希望这能解释得更好一些,并且一如既往,如果您有任何 cmet,请随时询问

    【讨论】:

    • 你说“一旦攻击者访问你的数据库并找到哈希”,它不也能找到盐吗?那么在数据库中存储盐有什么意义呢?
    • @kevin 我的理解是盐的全部意义在于使预计算攻击(如彩虹表攻击)无效,因为现在,攻击者必须为他们遇到的每个盐值构建彩虹表。
    【解决方案2】:

    PBKDF2 的输出取决于盐。如果你不存储盐,那么你就无法判断密码是否正确。

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

    【讨论】:

    • 我明白你的意思。但是我已经更新了我们的系统要求。在这种方法中,我认为我们不需要保存“盐”。
    • 所以你再也不需要计算散列了吗?那为什么还要使用它呢?
    • 问题是,这个“散列”密码将被发送给用户,并将用于进一步的第三方工具认证。如果我只是保存 CSPRNG 生成的随机字符串并将其发送给用户,那么问题将归结为猜测该字符串(所有用户的长度相同)有多容易?跨度>
    • 你是用它来生成随机令牌吗?
    • 基本上,是的。
    猜你喜欢
    • 2012-10-21
    • 2012-06-11
    • 2015-11-11
    • 2011-04-13
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2021-03-18
    相关资源
    最近更新 更多