【问题标题】:Platform-dependent PHP hashing in Production and Development environments生产和开发环境中依赖于平台的 PHP 哈希
【发布时间】:2023-03-25 13:54:01
【问题描述】:

我决定在 DB 中存储用户密码时放弃 md5() 作为密码加密算法,转而使用 phpass 库。

在使用 md5 的系统上,有一个生产/开发二元组没有问题,因为生成的哈希是相同的。因此,如果我在其中任何一个中创建了一个测试用户,那么相同的密码在另一个环境中也可以使用。

据我所知,这与其他类型的哈希算法不同,因为 phpass(或其内部 php 函数)会创建依赖于平台的哈希(我是哈希/加密新手)。

我的问题是,应该如何处理这种情况? prod/dev 中的不同数据库?但是,如果“楼上”决定我们应该将我们的 Web 应用程序(连同它的数据库)移动到另一台服务器 - 散列密码现在不会无效 - 因为 phpass 会为相同的创建 不同 散列(旧)密码?

后期编辑:

好吧,我没有费心去检查一个开发哈希到一个生产哈希。尽管它们不同,但它们的比较结果是“真实的”,就像“它们是等效的”一样。我想,如果哈希值不同,它们就不匹配(如 md5)。

【问题讨论】:

  • 你有支持 PHPass 依赖于平台的文档的链接吗?
  • 嗯..不。尽管如此,same 字符串的结果哈希在开发(Win XP)和生产(Ubuntu)中是不同的。
  • 它不应该在不同的机器上产生不同的结果,AFAIK。加密可以,但您不是在加密,而是在散列。如果无法进行其他测试,我猜你的 XP 机器没有与你的 Ubuntu 机器相同的哈希库,所以它使用/回退到不同的哈希算法。请参阅此处的示例 3:php.net/manual/en/function.crypt.php
  • 参见here为了确保不会发生回退,可以使用 PHP 5.3.0+ 或 Suhosin 补丁。 PHP 5.3.0+ 和 Suhosin 将 crypt_blowfish 集成到 PHP 解释器中,这样即使主机系统缺乏对 bcrypt 的支持,PHP 脚本也可以使用 bcrypt。
  • 当然这来自同一个链接:phpass 支持的首选(最安全)散列方法是 OpenBSD 风格的基于 Blowfish 的 bcrypt,也支持我们的公共域 crypt_blowfish 包(用于 C 应用程序),在 PHP 中称为 CRYPT_BLOWFISH,回退到 BSDI 样式的扩展基于 DES 的散列,在 PHP 中称为 CRYPT_EXT_DES,最后的手段回退到在 phpass 中实现的基于 MD5 的加盐和可变迭代计数密码散列本身(也称为可移植哈希)。 因此,它看起来会尝试使用 Blowfish(如果可用)。

标签: php hash phpass


【解决方案1】:

解决您的问题的一个非常简单的方法:始终使用最新的稳定版本的 PHP。自 5.3 起,PHP 提供了 crypt 算法的本机实现,因此不再依赖于平台。因此,您的哈希值应该是兼容的。

【讨论】:

    【解决方案2】:

    您决定使用 phpass 库有什么特别的原因吗?您没有详细说明这一点,但如果您只是在寻找比 MD5 更安全的算法,请查看 hash() 以及 sha512 之类的算法。

    【讨论】:

    • 在我看来,这无关紧要。这与哈希安全无关(尽管这导致我首先避免使用 md5),而是关于同一字符串的 不同 哈希以及如何在密码在另一个系统上无效的情况下处理此问题。
    • 哈希算法在不同的系统上不会产生不同的输出。我对 phpass 一无所知,但也许它在您的一个系统上使用了不同的算法,因为该系统不支持它在原始系统上使用的算法。
    【解决方案3】:

    PHP 中的老虎算法

    Tiger192,4 算法通常被推荐用于散列,但是我刚刚发现你可以在不同的机器上获得不同的散列值。

    不可能! (你说)

    事实证明 PHP LSB 实现 Tiger,而 PHP 5.4+ 首先使用 MSB 实现 Tiger。哪个是对的?我不能说(LSB 匹配 testtiger 而 MSB 匹配 wikipedia 示例)但重点是...... strong>(PHP 5.3->5.4 将破坏 Tiger 哈希密码表,这对可维护性有重大影响)。

    测试...

    echo hash("tiger192,3","The quick brown fox jumps over the lazy cog")."\n".
         hash("tiger192,3","");
    

    MSB: (PHP 5.4.5)
    a8f04b0f7201a0d728101c9d26525b31764a3493fcd8458f
    3293ac630c13f0245f92bbb1766e16167a4e58492dde73f3

    LSB: (PHP 5.3.2)
    d7a001720f4bf0a8315b52269d1c10288f45d8fc93344a76
    24f0130c63ac933216166e76b1bb925ff373de2d49584e7a

    (我的解决方案?使用不同的算法,在单元测试代码中嵌入一个已知的哈希测试)

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      相关资源
      最近更新 更多