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

多次哈希迭代:每次添加盐?

  •  36
  • NikiC  · 技术社区  · 14 年前

    我使用未加盐的md5/sha1已经很长时间了,但由于这种方法并不真正安全(而且随着时间的推移,安全性越来越低),我决定切换到加盐的sha512。此外,我希望通过使用多次迭代(例如100次)来降低哈希的生成速度。

    每次追加:

    // some nice big salt
    $salt = hash($algorithm, $salt);
    
    // apply $algorithm $runs times for slowdown
    while ($runs--) {
        $string = hash($algorithm, $string . $salt, $raw);
    }
    
    return $string;
    

    // add some nice big salt
    $string .= hash($algorithm, $salt);
    
    // apply $algorithm $runs times for slowdown
    while ($runs--) {
        $string = hash($algorithm, $string, $raw);
    }
    
    return $string;
    

    我最初想使用第二个版本(append one),但后来发现每次都有一些脚本附加salt。

    所以,我想知道是否每次添加它都会给散列增加一些强度。例如,攻击者是否有可能找到一些聪明的方法来创建一个100timesSha512函数,它比简单地执行sha512 100次要快得多?

    5 回复  |  直到 11 年前
        1
  •  51
  •   ircmaxell    14 年前

    简而言之:是的。按照第一个例子。。。如果在不添加原始数据的情况下反馈到自身,哈希函数可能会丢失熵(我现在似乎找不到引用,我会继续查找)。

    作为记录,我支持多次散列。

    对于您的服务器来说,需要500毫秒才能生成的哈希并不太慢(考虑到生成哈希通常不会在绝大多数请求中完成)。然而,一个需要这么长时间的散列将显著增加生成彩虹表所需的时间。。。

    是的,它确实暴露了DOS漏洞,但它也可以防止暴力攻击(或者至少使攻击速度慢得令人望而却步)。这绝对是一种权衡,但对某些人来说,好处大于风险。。。

    Key Strengthening

    至于退化碰撞,到目前为止我能找到的唯一来源是 this discussion

    还有一些关于这个话题的讨论:

    1. HEKS Proposal
    2. SecurityFocus blog on hashing
    3. A paper on Oracle's Password Hashing Algorithms

    还有一些链接:

    1. PBKDF2 on WikiPedia
    2. PBKDF2 Standard
    3. A email thread that's applicable
    4. Just Hashing Is Far From Enough Blog Post

    hash stretching

        2
  •  6
  •   NullUserException Mark Roddy    14 年前

    除了多次重新散列外,我还会为每个密码/用户使用不同的salt。虽然我觉得5000次迭代有点太多了,但是试着用一个更低的数字。这里有一个折衷办法,你必须根据你的需要和硬件来调整它。

    由于每个密码使用不同的盐,攻击者将被迫逐个强制执行每个密码,而不是构建彩虹表,这会大大增加工作负载。

    一如既往,这里有一个推荐阅读: Just hashing is far from enough

    编辑:迭代哈希是一种 perfectly valid tactic

        3
  •  3
  •   Marcin    14 年前
        4
  •  0
  •   blaze    14 年前

    迭代散列的原因是使进程尽可能慢。所以你可以做得更好:每次迭代使用不同的盐。它可以通过在每次迭代中用固定密钥反复加密原始数据并用salt值XORing来完成。

        5
  •  0
  •   xPheRe    14 年前