0

我有一个在 PHP 版本 5.2.10 上运行的系统 不幸的是,最初的程序员误解了 crypt() 是如何实现的。

$crypt = crypt(trim($cuPassword), CRYPT_BLOWFISH); 
// The programmer thought this is how you configure a blowfish cipher

nb CRYPT_BLOWFISH 在这台机器上的值为零。

这与它产生一个随机的密码哈希值一样有效,例如 0$oZ534I2VvSw

今天把软件移植到PHP 5.4.9 发现 $crypt 变成了 *0 ,也就是salt无效导致的错误。

我的问题是我有一个无法再验证的登录密码表。我的问题:有没有一种方法可以重新创建在 5.2 版下运行的原始密码?当您将“0”作为盐传递时,实现了什么哈希?

4

4 回答 4

1

你的描述并没有真正加起来。在 PHP 5.4.9 中,我对此进行了测试:

var_dump(crypt('hello', 0));

输出:

0$ny0efnQXFkE

现在在 PHP 5.5 中,您将*0在调用crypt('hello', 0). 不过没关系!因为这在 PHP 5.5 中仍然成立:this crypt('hello', '0$ny0efnQXFkE') == '0$ny0efnQXFkE'.

您需要做的就是更改为新密码生成哈希的方式。验证现有密码将继续有效。

为了更好地衡量,在人们成功登录后,检查他们的哈希是否以0$. 如果是这样,请使用更新的正确 crypt 调用重新散列密码(因为他们输入了密码,您就知道它是什么)。

于 2013-07-10T01:23:23.393 回答
1

我尝试了所有有效的两位数组合(CRYPT_STD_DES),我发现“0q”是等效的(几乎)。

PHP 5.2.10 crypt(trim($cuPassword), CRYPT_BLOWFISH);

结果 = 0$txv6CWBxJ9Y

PHP 5.4.9 crypt(trim($cuPassword), '0q');

结果 = 0qtxv6CWBxJ9Y

我需要做的就是调整第二个字符,我可以再次匹配密码。

于 2013-07-10T12:57:18.243 回答
0

不,您无法重新创建原始密码。否则即使是童子军也能打碎河豚。

您最好的机会是为您的用户生成一个随机密码并再次对其进行哈希处理,然后强制他们在登录后立即更改密码。

于 2013-07-10T01:04:54.187 回答
0

根据 crypt(3),"$" 不是一个有效的盐值,因此您需要找到一个与 PHP/libc 曾经拥有的一样损坏的 crypt 实现:)

如果验证旧密码就足够了,请使用 Matthews 的答案,否则尝试例如 openssl,它目前似乎仍然接受“0$”作为盐:

$ echo -n "secret" | openssl passwd -crypt -salt '0$' -stdin
0$z.PXBBy6uY.
于 2013-07-10T23:08:04.200 回答