【问题标题】:PHP Password Encrypting IssuesPHP密码加密问题
【发布时间】:2015-06-20 00:33:35
【问题描述】:

我正在尝试为我的网站创建登录和注册系统,但是我想使用比 md5 更安全的密码加密方法,但我遇到了问题。

function register_user($register_data) {
array_walk($register_data, 'array_sanitize');
$register_data['password'] = password_hash($register_data['password'], PASSWORD_BCRYPT, ['cost' => 10]);

$fields = '`' . implode('`, `', array_keys($register_data)) . '`';
$data = '\'' . implode('\', \'', $register_data) . '\'';

mysql_query("INSERT INTO `users` ($fields) VALUES ($data)");
email($register_data['email'], 'Activate your account', "
Hello " . $register_data['first_name'] . ",\n\nYou need to activate your account, so use the link below:\n\nhttp://thepuzzler.net/activate.php?email=" . $register_data['email'] . "&email_code=" . $register_data['email_code'] . " \n\n -ThePuzzler");      }

这是我没有遇到问题的注册功能,因为当用户注册时,BCRYPT 密码存储在我的数据库中。问题是验证用户。

function login($username, $password) {

$user_id = user_id_from_username($username);
$username = sanitize($username);
$password = password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]);

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

那是我的登录系统,当我尝试登录时,我自己获取用户名或密码不正确的错误。这是因为我认为加密的密码不匹配。所以我认为这与我创建$password 变量并加密它的行有关。

另外,在我的数据库中,密码列是 varchar(64)。感谢您的帮助

【问题讨论】:

    标签: php login password-hash


    【解决方案1】:

    password_hash() 函数在每次调用时生成一个单独的盐。要验证密码,您将需要password_verify() 函数。

    因此,您需要从数据库中获取密码哈希并将其与输入的密码一起传递给 password_verify()。

    编辑: 像这样:

    function login($username, $password) {
        $usernameForDb = mysql_real_escape_string($username);
        $hashFromDb = mysql_result(mysql_query("SELECT password FROM users WHERE username = '$usernameForDb'")); 
        $isValid = password_verify($password, $hashFromDb); 
        if ($isValid) {
            // user is accepted, get userID
            return user_id_from_username($username);
        }
        return false;
    }
    

    【讨论】:

    • 我明白你在说什么,但 password_verify() 返回一个 bool,所以我不知道你如何才能让 bool 等于数据库中的密码。
    • $hashFromDb = mysql_result(mysql_query("SELECT password FROM users WHERE username = '$username'")); $isValid = password_verify($passwordEnteredByUser, $hashFromDb); if ($isValid) {// 用户被接受,获取用户ID}
    • 此代码似乎易受 SQL 注入攻击。
    • 是的,@ScottArciszewski,你是对的。我在代码中添加了 real_escape
    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2013-02-05
    • 2015-08-05
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多