【发布时间】: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(如果可用)。