使用 PHP 将密码安全地存储在 MySQL 中,然后进行检查

Store safely a password in MySQL using PHP and checking it afterwards

我已经阅读了几篇文章并尝试使用不同的技术在 MySQL 中存储密码。我决定使用 cryptsalt 并且我终于能够将它插入到我的数据库中。使用的代码如下:

    $cost = 10;
    $salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
    $salt = sprintf("a$%02d$", $cost) . $salt;
    $hash = crypt($password, $salt);
    $query = "INSERT INTO users_registered(name , password) VALUES('$name', '$hash')"; 
    mysqli_query($con, $query);

我已经苦苦挣扎了几个小时的主要问题是如何检查我输入的密码是否正确...我确信我做错了什么,但我在这个领域是全新的安全性,我检查过的所有帖子都不适合我。这是我用来检查的代码:

$name = mysqli_real_escape_string( $con, $_POST['name'] );
$password = mysqli_real_escape_string( $con,$_POST["password"]);

$query = "SELECT * FROM users_registered where name='$name'";
$result = mysqli_query($con, $query);
$row = mysqli_fetch_assoc($result);
$hash=$row['password'];
if ($hash->hash==crypt($password, $hash->hash)) {
    echo "YEEEESSS";    
        }
else {
   echo "What I'm doing wrooooong!";}

问题来自 if,但我不确定应该放什么 :S 任何帮助将不胜感激:)

正如评论中已经建议的那样,最好的方法是使用password_hash()而不是使用:

$cost = 10;
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$salt = sprintf("a$%02d$", $cost) . $salt;
$hash = crypt($password, $salt);

就我而言,我的php版本低于5.5,我一直无法插入库compatible with lower versions,即使这是最安全的方法!

为了检查我存储的密码是否与用户通过$_POST输入的密码相同,必须修改if如下:

if (crypt($password, $hash) == $hash) {
   ...

这成功了!!考虑到我只是一个初学者,这种方法可能不安全:)