它是散列密码PHP的好/安全方式

时间:2014-04-02 07:16:13

标签: php passwords password-protection php-password-hash

我正在使用:

function generateHash($password) {
    if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
        $salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);
        return crypt($password, $salt);
    }
}

用于散列密码,但与PHP版本低于5.3.7不兼容。 所以我创建了这个小函数来生成和验证密码但是因为我不是安全专家,所以我想知道它是否相当安全或者仍然不安全。

我的功能:

//$hash variable is also used to check weather we are creating or verifying passwords.
function password($password,$hash=FALSE){

    $salt=array("hfuiliffa","wiaelfbs","usfewl","fr6j5","gwg8","bs4$","fgthwv");//An array of salts
    if ($hash){
        foreach ($salt as $s1)
            foreach ($salt as $s2)
                if ($s1.sha1($s2.$password)===$hash)
                return true;

        return FALSE;//If we are still here means time to return false.
    }else {
        return $salt[array_rand($salt)].sha1($salt[array_rand($salt)].$password);
    }
}

1 个答案:

答案 0 :(得分:0)

您可以做的最好的事情是使用新功能password_hash()。正如您所知,有一个compatibility pack适用于PHP 5.3.7版。向上。

如果您确实需要支持较低的PHP版本,可以将crypt参数从“$ 2y $%02d $”替换为“$ 2a $%02d $”,这也会生成BCrypt哈希。这是旧版本的最佳功能。或者,您可以在我的主页上查看example code

if (version_compare(PHP_VERSION, '5.3.7') >= 0)
  $algorithm = '$2y$%02d$'; // BCrypt, with fixed unicode problem
else
  $algorithm = '$2a$%02d$'; // BCrypt

如果您绝对需要支持PHP 4.x,则不支持BCrypt,在这种情况下,我建议使用phpass库。顺便提一句,你的方案与恒定的“盐”几乎没有任何保护。