7

在不知不觉中,我实现了一个使用 md5 作为哈希算法的登录系统。现在我确实知道得更多,我想转向使用 PHPass。我的问题是系统已经在生产中,要求所有用户更改密码将是所有麻烦的根源。

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

我的解决方案如下:

改变

  1. md5($_POST['pass'])
  2. 根据数据库值检查 md5 哈希密码

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

只是为了清楚起见,我只是重新散列 md5 版本,因为那是我已经在数据库中拥有的。它不打算作为一种附加的安全措施(尽管如果是的话,那就太好了!)。

4

4 回答 4

4
  1. MD5() 问题在这个狂热的程序员社区网站上被夸大了。这种散列算法实际上并没有什么不好,特别是与通常的新手应用程序的其他部分相比。在普通的 PHP 站点上使用 phpass 技术就像在草屋的纸门上使用安全锁。

  2. 保持密码安全以防止虚拟可能被盗并在其他网站上针对同一用户使用(哦,我的!),最重要的是密码强度和盐。不是散列算法本身。没有散​​列技术可以保护像“1234”或“joe”这样的愚蠢通行证。
    所以,md5 + strong password + average saltusual password + phpass

  3. phpass 现有的 md5 哈希没有一个单一的理由
    一个合理的迁移算法是

    • 检查此用户记录以获取新的散列标志。
    • 如果已设置 -
      • 去 phpass 身份验证
    • 如果不:
      • md5($_POST['pass'])
      • 根据数据库值检查 md5 哈希密码
      • 如果正确:
        • phpass($_POST['pass'])
        • 将结果保存在数据库中
        • 为此记录设置新的散列标志
    • 完毕
于 2011-09-04T08:10:33.793 回答
1

您正在谈论的问题并不是 PHPass 所特有的,而是一般的散列密码。它基本上只是双重哈希。这个话题已经在另一个问题中讨论过:“双重哈希”密码是否比只哈希一次更安全?

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

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

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

于 2011-09-04T07:59:09.017 回答
1

你在这里得到了一些非常可疑的建议,所以你可能想问一下IT Security。与某些人所说的相反,密码哈希算法确实很重要。您想使用加盐和慢速哈希,例如 bcrypt、scrypt 或 PBKDF2。请参阅:我应该使用哪种密码散列方法?,有没有安全专家推荐 bcrypt 用于密码存储?,如何安全地散列密码?,最安全的密码哈希算法?. PHPass 是一个很好的库。

要将您的用户迁移到 PHPass,您需要拥有两个密码哈希数据库:旧的(使用 MD5 哈希)和新的(使用 PHPass 哈希)。最初,新的将是空的。当用户登录时,检查您在旧密码哈希数据库中是否有他们的条目(使用 MD5 哈希),如果在那里找不到条目,​​请查看新密码哈希数据库(使用 PHPass 哈希)。如果您在旧数据库中找到一个条目,您将需要使用 MD5 散列并检查其密码。如果正确,您将需要使用 PHPass 对他们的明文密码进行哈希处理,将其插入新密码哈希数据库,然后将其从旧密码哈希数据库中删除。如果您在旧数据库中没有找到条目,您可以在新数据库中检查条目并使用 PHPass 检查其密码的有效性。

于 2011-09-09T03:46:37.457 回答
-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,原理是一样的。

于 2011-09-04T11:37:11.530 回答