使用现有的MD5哈希与PHPass有任何安全隐患吗?

时间:2011-09-04 07:47:00

标签: php security migration phpass

在我了解之前,我实现了一个使用md5作为哈希算法的登录系统。现在我知道的更好了,我想转向使用PHPass。我的问题是系统已经投入生产,要求所有用户更改密码将成为所有头痛的母亲。

我已经提出了一个简单的解决方案,但鉴于我之前的错误,我想确保我不会因为无知而犯同样严重的错误。

我的解决方案如下:

更改

  1. md5($_POST['pass'])
  2. 根据数据库值检查md5哈希密码
    1. md5($_POST['pass'])
    2. 将md5哈希密码传递给$hasher->HashPassword()
    3. 使用$hasher->CheckPassword()根据DB
    4. 的值检查重新散列的密码

      为了清楚起见,我只是重新编写了md5版本,因为这是我在数据库中已有的内容。它不是一个额外的安全措施(尽管如此,那太好了!)。

4 个答案:

答案 0 :(得分:4)

  1. MD5()问题在这个发烧友程序员社区网站上被夸大了。这种哈希算法没有什么坏处,特别是与通常的新手应用程序的其他部分相比。在通常的PHP网站上使用phpass技术就像在稻草小屋的纸门上使用安全锁。

  2. 最重要的是保持密码免受虚拟被盗和被其他网站上的同一用户使用的可能性(哦,我的!)密码强度和盐。不是哈希算法本身。 没有哈希技术可以保护像“1234”或“乔”这样的愚蠢传球 因此,md5 + strong password + average salt优于usual password + phpass

  3. 没有理由通过现有的md5哈希
    合理的迁移算法是

    • 检查此用户记录以查找新的哈希标记。
    • 如果设置 -
      • 去phpass auth
    • 如果不是:
      • MD5($ _ POST [ '通'])
      • 根据数据库值检查md5哈希密码
      • 如果正确的话:
        • phpass($ _ POST [ '通'])
        • 将结果保存在数据库中
        • 为此记录设置新的哈希标记
    • 完成

答案 1 :(得分:1)

您所谈论的问题并非真正针对PHPass,而是一般的哈希密码。它基本上只是双重散列。在另一个问题中已经讨论过这个主题:Is "double hashing" a password less secure than just hashing it once?

如果你看一下,你会发现仍然存在关于双重散列是否更糟的争论,因为它减少了传递到第二个(或后续)散列函数的字符范围。但是,它会减慢散列过程,对抗蛮力攻击,但只做两次就不会起到减速的作用。

如果您不想处理双重哈希,那么您可以尝试做的是在users数据库表中添加一个标记字段,并将其设置为true以用于所有新的在您设置新的PHPass形式的哈希之后加入的用户。然后,当用户登录时,如果他们没有设置标志字段,请使用旧的哈希系统或您在问题中详细说明的修改版本。如果他们有标记字段,您可以使用您设置的任何新哈希过程。

更新:实际上,在此基础上,你可以尝试的是设置标志,一旦他们在旧系统下登录,如果是匹配,那么你将会在$_POST数据中仍然保留未使用的密码,因此您可以通过新的哈希设置运行该密码,保存新哈希,然后将标记设置为true,因为它们已升级为新的哈希方法。从那时起,他们将使用新的散列方法。

答案 2 :(得分:1)

你在这里得到了一些非常可疑的建议,所以你可能想问IT Security。与一些人所说的相反,密码哈希算法确实很重要;你想使用salting和慢速哈希,如bcrypt,scrypt或PBKDF2。请参阅:Which password hashing method should I use?Do any security experts recommend bcrypt for password storage?How to securely hash passwords?Most secure password hash algorithm(s)?。 PHPass是一个很好的库。

要将用户迁移到PHPass,您需要拥有两个密码哈希数据库:旧密码哈希数据库(使用MD5哈希值)和新密码哈希数据库(使用PHPass哈希值)。最初,新的将是空的。当用户登录时,检查旧密码哈希数据库中是否有条目(带有MD5哈希),如果在那里找不到条目,​​请查看新密码哈希数据库(使用PHPass哈希)。如果在旧数据库中找到条目,则需要使用MD5进行哈希并检查其密码。如果正确,您将需要使用PHPass哈希其明文密码,将其插入新密码哈希数据库,并从旧密码哈希数据库中删除它们。如果在旧数据库中找不到条目,​​则可以检查新数据库中的条目,并使用PHPass检查其密码的有效性。基本上,您在下次登录时逐渐将每个用户从旧式哈希迁移到新式哈希。这有意义吗?

答案 3 :(得分:-1)

我的方法确保密码长度至少为8个字符并包含非随机垃圾字符(“垃圾”意味着可能是不可打印的/空字符):

function pass_hash ($password) {
    # take first 8 characters of the raw md5 hash
    $hashslice = substr(md5($password, true), 0, 8);
    # add it to the password and hash again
    return md5($password . $hashslice);
}

如果您不喜欢md5,只需使用sha1,原则就是一样。