PHP 将来自 db 的加密密码与来自表单的插入密码进行比较


PHP Compare a crypted password from db with an inserted password from a form

我有一个带有加密密码的数据库。当用户登录时,我这样做:

$result = mysqli_fetch_assoc(mysqli_query($conn,$query));
$cryptedPass = $result['password'];
$pass = $_POST['password'];
if(strcmp($cryptedPass,md5($pass))==0)
   echo "yeah!";

它有效,但我想知道这是否是正确的方式,或者是否有更安全的方法!

不要使用 MD5。有很多在线文档可以解释这是多么不安全。例如:

https://en.wikipedia.org/wiki/MD5

我建议使用crypt()功能。

在这里阅读: http://php.net/crypt

一个好的使用将是CRYPT_BLOWFISH

这是我不久前发现的一个功能,我使用。不幸的是,我不记得在哪里找到它,所以我无法参考作者。

function blowfishEncrypt($string,$rounds) {
        $salt = "";
        $saltCharacters = array_merge(range('A','Z'),range('a','z'),range(0,9));
        for ($i=0;$i<22;$i++) {
            $salt .= $saltCharacters[array_rand($saltCharacters)];
        }
        $hashstring = crypt($string,'$2y$' . $rounds . '$' . $salt);
        return $hashstring;
    }

要创建加密密码,您将像这样使用它:

$cryptedPass=blowfishEncrypt($clearPass,'07');

然后为了进行比较,您将使用:

if($cryptedPass==crypt($pass,$cryptedPass)) {
    echo 'Yeah!';
}

注意:如果您使用的是 5.3.7 之前的 PHP 版本,则 salt 前缀必须为 $2a$

PHP 5.3.7 引入了新的前缀$2y$来修复安全漏洞 在河豚实施中。