PHP密码从MD5()到crypt()Blowfish

时间:2013-12-28 15:22:14

标签: php hash md5 crypt

我在旧应用程序中使用了MD5()密码哈希,我想切换到crypt()哈希,因为它更安全。但是......我对crypt()函数没有任何体验。

所以现在哈希我有这个:

  function hashPassword($uPassword) {
        $processingPower = 10;
        $salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
        $salt = sprintf("$2a$%02d$", $processingPower) . $salt;
        $hash = crypt($password, $salt);
        return $hash;
    }

为了比较密码,我有这个:

if (crypt($uPassword, $uData['uPassword']) == $uData['uPassword']) 

似乎一切正常,但我仍然可以使用存储在我的dB中的旧(MD5)密码登录。 这是正常行为还是我的代码中出现了问题?

1 个答案:

答案 0 :(得分:1)

MD5密码以$1$开头。 crypt()可以通过这种方式识别MD5哈希并正确识别它们(请参阅http://php.net/crypt

一种典型的策略是确定散列类型并在登录时更新散列,以便您可以无缝更新散列。理想情况下,您使用password_hash() group of functions,因为它们会隐藏详细信息并阻止您错误地实施它。如果php开发人员改变他们的默认值(例如,因为它们被证明是不安全的),你的应用程序将在php更新后自动更新哈希值。

它们本身可以使用php 5.5,但对于php> = 5.3.7,可以在https://github.com/ircmaxell/password_compat找到兼容性库。它基本上完成了你上面写的,只是有更多选项,比如使用openssl,如果mcrypt不可用,它提供了标准的API。