代码之家  ›  专栏  ›  技术社区  ›  Brandon O'Rourke

如何将salt添加到现有密码哈希中?

  •  12
  • Brandon O'Rourke  · 技术社区  · 15 年前

    我有一个散列密码的数据库,在散列密码之前没有添加盐。我想在新密码中添加salt。显然,我不能把现有的散列。

    您将如何迁移到新的哈希系统?

    8 回复  |  直到 15 年前
        1
  •  31
  •   Spencer Ruport    15 年前

    当然可以。只需在现有哈希中添加一个盐,然后再次进行哈希。当然,这将需要将来的任何登录经历相同的过程,这意味着需要调用两个哈希函数,但无论如何,许多合法的模式都会这样做,因此闻起来不像您想象的那么糟。

    加盐密码是一种防御彩虹表的努力。在这种情况下,盐不需要是秘密。

    http://en.wikipedia.org/wiki/Rainbow_tables#Defense_against_rainbow_tables

    你可以在文章中看到

    hash = MD5 (MD5 (password) . salt)
    

    这和你将使用的方法是一样的。(除了一个不同的哈希函数。)

        2
  •  14
  •   John Rasch    15 年前

    作为一个快速修复方法,您可以在数据库中创建salt列,当用户正确登录到与旧哈希匹配的哈希时,您可以使用他们用salt输入的密码并创建一个新的哈希。

        3
  •  2
  •   Sinan Taifour    15 年前

    您可以添加一列,该列由一个标志组成,该标志显示用户是否具有 古老的 (没有盐)或 新的 (加盐)土豆泥。

    此时,一个好主意是强制所有用户在登录时更改密码。这样你最终可以摆脱那个专栏。

        4
  •  1
  •   Amish Programmer    15 年前

    我处理了一个涉及多个哈希技术的类似问题。我也使用了在数据库中编码散列方法类型的方法(即“alpha”、“beta”、“gamma”、“delta”)。我用适当的级别标记了所有当前哈希。当用户登录时,我验证了他们的密码,并使用更新的方法重新散列。我们的密码将在90天后过期,所以只需保留3个月,直到所有使用旧方法的密码都可以重置。

        5
  •  0
  •   nik    15 年前

    some ways here 这可能对你有用。
    记住,您添加到现有哈希中的任何常量模式都是无用的(该链接上的一个技巧就是建议使用类似的方法)。不应存在可用于分离盐的可识别模式。

    当然,最好的方法是迁移到一个咸哈希表。

        6
  •  0
  •   Cameron    15 年前

    在数据库中创建一个名为“salted”的新字段,其类型为true/false(或DBMS中的等效字段)。将现有哈希的所有值设置为false。每当添加一个新的加盐散列时,将“加盐”字段设置为true。

    然后,您所要做的就是在代码中以不同的方式处理这两种类型的哈希。

    这更像是一个通用的解决方案,而不是一个特定的解决方案,但它应该能解决您的问题。

        7
  •  0
  •   NerdFury    15 年前

    如果您将盐存储在散列中,那么应该相当直接地通过检查散列的长度来确定是否包含盐。如果没有盐,只需散列密码,如果有盐,散列密码+盐。

    在数据库中不需要布尔列。

        8
  •  0
  •   D. M.    15 年前

    存储salt的最佳方法是将salt值嵌入到刚刚创建的密码hash+salt中。我不将salt字符串附加到哈希的开头或结尾,而是直接将salt嵌入哈希中。