使用PHP在MySQL中安全地存储密码并在之后进行检查

时间:2015-11-20 10:47:11

标签: php mysqli hash salt crypt

我一直在阅读几篇文章并尝试使用不同的技术在MySQL中存储密码。我决定使用cryptsalt,我终于可以将它插入我的数据库了。使用的代码如下:

    $cost = 10;
    $salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
    $salt = sprintf("$2a$%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 任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:0)

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

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

在我的情况下,我的php版本低于5.5,并且我无法插入库compatible with lower versions,即使它是最安全的方式!!

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

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

这就行了!考虑到我只是一个乞丐,这种方法可能不安全:)