生产和开发环境中依赖于平台的PHP哈希

生产和开发环境中依赖于平台的PHP哈希,php,hash,phpass,Php,Hash,Phpass,在数据库中存储用户密码时,我决定放弃md5()作为密码加密算法,转而使用库 在使用md5的系统上,生产/开发二元是没有问题的,因为生成的哈希是相同的。所以,如果我在其中一个环境中创建了一个测试用户,那么相同的密码在另一个环境中工作 据我所知,这与其他类型的散列算法不同,因为phpass(或其内部php函数)会创建依赖于平台的散列(我是散列/加密新手) 我的问题是,应该如何处理这种情况?prod/dev中的不同数据库?但是,如果“楼上”决定我们应该将我们的web应用程序(连同它的DB)移动到另一台

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

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

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

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

稍后编辑:
好吧,我没有费心去检查一个开发散列到生产散列。尽管它们是不同的,但它们的比较结果是“正确的”,就像“它们是等价的”。我想,如果散列不同,它们就不匹配(如md5)。

您决定使用phpass库有什么特别的原因吗?您没有详细说明这一点,但是如果您只是在寻找一种比MD5更安全的算法,那么请看一看与sha512这样的算法相结合的情况。

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

PHP中的Tiger算法

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

不可能!(你说)

事实证明,PHP5.4将打破一个
Tiger
哈希密码表,这对可维护性有重大影响)

测试

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

3293ac630c13f0245f92bbb1766e16167a4e58492dde73f3

LSB:(PHP5.3.2)
D7A001720F4BF0A8315B5269D1C10288F45D8FC93344A76

24f0130c63ac933216166e76b1bb925ff373de2d49584e7a


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

您是否有支持PHPass依赖于平台的文档链接?嗯。。不。尽管如此,相同字符串的结果哈希在dev(winxp)和production(Ubuntu)中是不同的。AFAIK,它不应该在不同的机器上产生不同的结果。加密可以,但你不是在加密,你是在散列。如果不能进行其他测试,我猜你的XP机器没有与你的Ubuntu机器相同的散列库,所以它使用了不同的散列算法。请参见这里的示例3:请参见:为了确保回退不会发生,可以使用PHP5.3.0+或Suhosin修补程序。PHP 5.3.0+和Suhosin将crypt_blowfish集成到PHP解释器中,这样即使主机系统不支持bcrypt,PHP脚本也可以使用bcrypt。当然,这来自同一链接:phpass支持的首选(最安全)散列方法是基于OpenBSD风格的blowfish的bcrypt,我们的公共域crypt_blowfish包(用于C应用程序)也支持crypt_blowfish,在PHP中称为crypt_blowfish,它支持BSDI风格的扩展DES哈希,在PHP中称为crypt_EXT_DES,最后一种方法是在phpass中实现基于MD5的salt和可变迭代计数密码哈希(也称为可移植散列)。因此,它似乎试图使用河豚(如果可用)。在我看来,这无关紧要。这与散列安全无关(尽管这导致我首先避免使用md5),但是关于同一字符串的不同哈希,以及如何在另一个系统上不使密码无效的情况下处理此问题。哈希算法在不同的系统上不会产生不同的输出。我不知道phpass的任何内容,但可能它在您的一个系统上使用了不同的算法,因为该系统不支持algo它在原始系统上使用的rithm。