【问题标题】:Salting Algorithm Strength盐渍算法强度
【发布时间】:2010-01-04 15:15:51
【问题描述】:

这 3 种创建盐的方法的优点/缺点是什么?

$salt = md5($password);

$salt = sha1(md5($password));

$salt = generate_random_number();

计算哈希:

$hash = sha1($salt + $password);

【问题讨论】:

  • 不是一个真正的问题,但我没有选票...
  • 这里拼写成stackoverflow.com/faq
  • 嗯,对我来说似乎是“真实的”
  • @helloworler:你的问题很真实。不过,它需要扩展讨论。很可能,讨论中不会有真正的答案。 PS(无法抗拒)是我们的宝贝,不是你。
  • 只有最后一个函数是实际加盐,前两个函数将返回相同密码的相同盐值,因此相同密码返回相同的哈希值。只有随机盐才有帮助

标签: php cryptography salt


【解决方案1】:

要回答这个问题,了解什么是盐很重要。

Salt 旨在通过预先计算的表格来抵御攻击。例如彩虹表。彩虹表是一个巨大的表,所有可能的密码变化都达到一定长度。 (使用巧妙的内存/时间权衡。)

如果攻击者只想破解一个密码,他们就没有优势。

如果上面的陈述不正确

  • 数据库不使用盐。然后可以使用普通的彩虹表。
  • 盐太少了。如果盐值太短,它的效果与只是使用更长的密码相同。
  • 它是一种普通的盐,如 salt。肯定已经有一些彩虹表包含了这种盐。

使用彩虹表的攻击者通常希望破解尽可能多的帐户。

您的哪种方法最安全?

除第三种方法外,您的所有方法均不安全。这是因为使用任何其他方法都可以让攻击者为您的整个数据库计算彩虹表。

因为盐依赖于密码。也不要让它依赖于用户名,这仍然允许攻击者为 100 个最常见的用户名创建彩虹表。

记住

  • 仅使用加密安全的随机生成器来计算您的盐。
  • 不要使用 MD5。它已被视为已损坏,请至少使用 SHA1。

【讨论】:

  • 那不是彩虹桌。彩虹表不是字典的预计算哈希,它稍微复杂一些。它是特定值的预先计算的哈希值,用于迭代地磨练明文。
  • @blowdart:最终它们所有密码的巨大字典,使用巧妙的存储/时间权衡。
  • @blowdart:不可能。密码散列函数旨在确保无法猜测一半密码。彩虹表使用哈希链。哈希链越长,破解密码所需的计算时间就越多,但所需的空间越少。那是因为只存储了该链的第一部分和最后一部分。 en.wikipedia.org/wiki/Rainbow_tables
  • 答案基本上是正确的,但如果我们吹毛求疵,最好说 salts 旨在防止基于预先计算的表的攻击,或者哪些彩虹表是特定类型。
  • 我也不会使用 SHA1。虽然仍然比 MD5 更安全,但它看起来越来越不稳定。你甚至可以得到像这样的“笔测试”工具sourceforge.net/projects/ssha-attack
【解决方案2】:

前两种方法毫无价值。加盐的重点是相同的密码并不总是会产生相同的加密/散列字符串。

如果您使“盐”仅依赖于密码,则相同的密码将始终产生相同的哈希值。所以基本上结果是一样的,如果你使用一个稍微不同的哈希函数而不加任何盐。

使用第三种方法时,具有相同密码的两个用户通常会得到不同的盐,并且密码的哈希版本对于两个用户来说看起来会有所不同。很难通过哈希判断它们都具有相同的密码。

【讨论】:

    【解决方案3】:

    严格来说,您只有一种加盐方法,您可以在其中计算哈希值。前三行是生成盐的不同方式。

    所以有一种盐可以阻止预先计算的查找表发现密码。它应该是存储的固定值,最好是被散列的纯文本唯一的值。

    最安全的方法是使用加密安全的随机数生成器生成盐,然后将其与密码一起存储。

    如果您创建了一个作为密码的 MD5 的盐,那么它必须与散列和加盐的密码值一起存储,这意味着您有一个未加盐的散列,它容易受到预先计算的查找表的影响,除非您打算计算它每次都会对性能造成很小的影响。通过采用 MD5 散列的 SHA 散列,您可以减少纯文本值的可能性,因为 MD5 散列值的数量是有限的,因为它们是固定长度的。这意味着彩虹表查找可能比真正随机的盐有更大的成功机会。

    所以请使用随机盐。

    【讨论】:

    • 盐的特殊弱点取决于我没想过的密码,很有趣。
    【解决方案4】:

    考虑彩虹表的一种有用方法是,可以为任何只有一个输入的单向(或“活板门”)函数构建它们。也就是说,如果您对所有密码使用相同的函数 F:hash = F(password)。 F 可以是 MD5 或 SHA1 或其他。

    现在让我们看看盐。您使用加盐函数 G,哈希 = G(盐,密码)。如果你的数据库中的所有密码都使用相同的salt,你可以构造一个函数G,其中G(password) = F("your salt", password),所以只有一个输入函数,这样你就可以建立一个彩虹表.

    如果盐依赖于密码怎么办?说salt = I(password),我们可以构建J(password) = G(I(password), password),单输入函数,这样就可以构建彩虹表了。

    因此,每个密码都需要有自己的盐。这意味着,在攻击者破解您所有密码的时间里,他们只能破解一个。

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 1970-01-01
      • 2011-04-03
      • 2011-08-07
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多