如何登录bcrypt


How to login with bcrypt

我想将注册/登录页面从md5更改为bcrypt。注册部分是好的,但我不能得到登录部分工作良好。我正在尝试使用bcrypt库;https://github.com/ircmaxell/password_compat/blob/master/lib/password.php.

原来的登录函数(没有md5)是这样的;

function login($username, $password) {
    $user_id = user_id_from_username($username);
    $username = sanitize($username);
    return (mysql_result
    (mysql_query
    ("SELECT COUNT(`user_id`) 
    FROM `users` 
    WHERE `username` = '$username' 
    AND `password` = '$password'"), 0) == 1) ? $user_id : false;
}

我要做的是检索数据库,但原始代码是不可能的,因为mysql_result部分。例如,我认为;

function login($username, $password) {
    $username = sanitize($username);
    $user_query = mysql_query("SELECT `password` FROM `users` WHERE `username` = '$username'");
    $row = mysql_fetch_assoc($user_query);
    $hash = $row['password'];
    password_verify($password, $hash);
}

可以解决这个问题,但它不是。

是否有解决方案没有mysql_fetch_assoc()在这里或者我试图检索数据库错误?

您需要这样设置password_verify:

function login($username, $password) {
    $sql = "SELECT * FROM users WHERE username = :username"; // Select all info related to the USERNAME
    $loginQ = $dbh->prepare($sql); // Prepare your query
    $loginQ->bindParam(':username', $username); // Bind your variable
    $loginQ->execute(); // Execute (TRUE or FALSE)
    if ($loginQ) { // If TRUE
        if ($loginQ->rowCount() == 1) { // You should only be returning 1 row with 1 username
            $row = $loginQ->fetch(); // Fetch that row 
            $hash = $row['password']; // Use the row password and assign it to a variable 
            if (password_verify($password, $hash)) { // use passwd_compat function password_verify to check if it passes, if it does return TRUE
                return TRUE;
            }
        }
    }
}

只是从阅读你的代码的问题,我首先注意到的是,你没有返回一个值,无论是

真正

还有另一种理解如何使用password_verify的方法,你也可以这样做:

if (password_verify($form_password, $row['password'])) {
    $_SESSION['LoggedIn'] = TRUE;
    header("location: homepage.php");
} else {
   Echo "Wrong password or username please <a href='index.php'><b>Retry!</b></a>";
}

和我注意到的下一个问题是,你正在使用不安全的和旧的函数(mysql_)

为了帮助你解决上面的问题,我做了一个PDO版本供你使用,它比mysql_有更多的优点。

然后设置PDO看看这个答案(是的,这是我的-有很多很好的答案,所以做一些研究),这给了你从设置PDO实例到实际使用它的步骤。有问题就问。