【问题标题】:php security: Using MD5, SHA1, Saltingphp 安全性:使用 MD5、SHA1、Salting
【发布时间】:2009-09-25 13:55:44
【问题描述】:

目前我的许多密码都是混合使用 md5 和 sha1 存储的,但是我刚刚被介绍过加盐,并想知道最安全的密码。

我确信一个简单的 md5() 可以很容易地被撤销,但是 md5(sha1(md5($var))); 呢?这个组合是否提供了更多的难度,或者更多不一定更好。

还有,正在做

$var = $var.'t00lup';
md5($var);

比上述更安全,假设 t00lup 是私钥?

有没有比只使用 md5 或只使用 sha1 更好的方法?

谢谢

【问题讨论】:

    标签: php security md5 sha1


    【解决方案1】:

    几件事:

    1. 只需使用 SHA256 - 无需重新散列。

    2. 不要只为每个帐户硬编码一个盐。为每个用户生成一个随机盐,并将其放在数据库中的用户记录中。这样,如果有人为该盐生成彩虹表,至少他们只能访问该一个用户帐户,而不是所有用户帐户。

    【讨论】:

    • 啊,是的,太棒了。谢谢。
    • +1 用于为每个人生成新盐 - 很多人误解了这一点。
    • 只使用一种哈希算法,但重复数千次。
    • 使用用户 ID(数据库表中的主键)作为 salt hash 怎么样?
    • @tomp - 这可能也很好。我通常不这样做的唯一原因是,如果您使用自动生成的用户 ID,那么在创建用户记录时您将没有用户 ID。因此,一旦您从插入的行中获得了用户 ID,就需要一个 INSERT 来创建记录,然后再进行一次 UPDATE 来设置密码哈希。此外,它本质上创建了一个两用列(它既是 id 又是 salt),如果可能的话,我会尽量避免。
    【解决方案2】:

    更多不一定更好。只需使用 Sha256 即可。

    $var = $var.'t00lup';
    $hashedPass=hash('sha256', $var);
    

    阅读更多关于 hash() here.

    【讨论】:

    • 是的。它实际上支持大约 35 种不同的哈希算法。见这里:us.php.net/manual/en/function.hash-algos.php
    • 我的意思是它本身不支持它。需要哈希扩展
    • 哈希扩展是 PHP 核心的一部分。见这里:us.php.net/manual/en/hash.installation.php
    • 嗯,它从 5.1.2 开始就成为核心的一部分。除此之外,您可以将其作为 pecl 扩展。无论如何,这比仅使用 sha1 或 md5 更好。
    • 不,不是。 sha256 已经足够好了,但我通常选择它而不是 sha512 只是因为散列大小只有一半,所以你在数据库中节省了一些空间。如果您愿意,可以使用 512。
    【解决方案3】:

    绝对需要使用盐,否则,攻击者可以使用现有的预计算表来简单地查找用户使用过的所有短密码或字典密码的哈希值。您可以自己尝试:获取一个非常糟糕(短或字典)密码的 MD5,然后在 Google 上搜索结果 - 很可能您会在某个地方获得成功。

    使用盐,现有表将变得毫无用处,并且除了最足智多谋和积极主动的攻击者之外,计算您自己的表需要很长时间。每个用户的单独盐甚至更好(否则知道盐的攻击者可以一次攻击您的所有用户)。

    组合散列可能会产生类似的效果,但不应将其用于该目的(没有盐),因为该组合仍然可能存在预先计算的表。

    但是,哈希的组合和重复具有其自身的价值,通过增加攻击者进行字典攻击所需的时间:应用 MD5 一万次仍然需要几分之一秒,并且作为一部分是可行的的登录过程。但是对于字典攻击,花费 10,000 倍的时间 是个问题。

    这种技术被称为key strengthening

    【讨论】:

      【解决方案4】:

      VBulletin 使用类似 md5(md5($password).$salt) 的东西。好像还可以。

      【讨论】:

        【解决方案5】:

        我认为做一些加盐可以提高安全性,因为它会使字典攻击更加困难,而且即使密码很短,整个安全级别仍然可以。

        最重要的是散列算法和生成的散列的长度,因此您最好研究 sha256 或更好。

        【讨论】:

        • 另外 md5 已被证明有冲突,两个不同的输入产生相同的哈希。而且 md5 在当前 CPU 能力下很容易破解,所以不建议再使用它
        • 所有哈希算法都有冲突,当输出具有固定大小时,甚至不可能有没有冲突的哈希算法。而且 MD5 并不是真正“容易破解”——它有一些弱点可以在某些情况下被利用,因此通常应该使用更好的算法。但是,除了通过(有些改进的)蛮力和字典攻击之外,您可以轻松找到给定 MD5 哈希的匹配输入仍然不是真的。
        猜你喜欢
        • 2013-05-18
        • 2011-02-26
        • 2014-09-17
        • 2014-08-04
        • 1970-01-01
        • 2016-03-14
        • 1970-01-01
        • 2012-03-31
        • 1970-01-01
        相关资源
        最近更新 更多