PHP MySQL PDO Войти / Регистрация системы через PBKDF2 Шифрование не будет входить в систему - PullRequest
0 голосов
/ 23 февраля 2020

Я работаю со специфицированным c шифрованием ( PBKDF2 ) по некоторым причинам. Сейчас я создаю веб-сайт, и у меня возникла проблема с системой входа в систему. Страница регистрации работает отлично, как хотелось.

У меня не появляется никаких сообщений об ошибках, когда я пытаюсь войти в систему, но пароль не совпадает. Вот моя регистрация. php:

<?php
require '../global.php';
$pdo = New Database();
$account->IPisBanned($_SERVER['REMOTE_ADDR']);
$account->isConnected();

if(!empty($_POST['username']) AND !empty($_POST['email']) AND !empty($_POST['password']) AND !empty($_POST['password_confirmation'])) {
    $bdd = $pdo->query('SELECT id FROM users WHERE username = ?', [$core->F_HTML($_POST['username'])]);
    if($bdd->rowCount() == 0) {
        if(preg_match('`^([a-zA-Z0-9-=?!@]{3,15})$`', $core->F_HTML($_POST['username']))) {
            $bdd2 = $pdo->query('SELECT id FROM users WHERE email = ?', [$core->F_HTML($_POST['email'])]);
            if($bdd2->rowCount() == 0) {
                if(filter_var($core->F_HTML($_POST['email']), FILTER_VALIDATE_EMAIL)) {
                    if($_POST['password'] == $_POST['password_confirmation']) {

                        if(strlen($_POST['password']) >= 6 AND strlen($_POST['password_confirmation']) >= 6) {

                            $iterations = 10000;
                            $length = 40;
                            $secret = "at_least_16_byte";
                            $salt = $secret.$_POST['username'];
                            $hash = hash_pbkdf2("sha1", $_POST['password'], $salt, $iterations, $length);
                            $hash = strtoupper($hash);

                            $bdd3 = $pdo->query('INSERT INTO users (username, password, mail, account_created, ip_reg) VALUES (?, ?, ?, ?, ?)', [$core->F_HTML($_POST['username']), $core->F_HTML($hash), $core->F_HTML($_POST['email']), time(), $_SERVER['REMOTE_ADDR']]);
                            $_SESSION['id'] = $pdo->lastInsertId();
                            echo 'success';
                        } else {
                            echo 'Passwords does not match.';
                        }
                    } else {
                        echo 'Password too short.';
                    }
                } else {
                    echo 'Invalid email address.';
                }
            } else {
                echo 'This Email is already used by another account.';
            }
        } else {
            echo 'Invalid username.';
        }
    } else {
        echo 'Username already in use.';
    }
} else {
    echo 'Required fields are emtpy.';
}
?>

А вот и мой логин. php:

<?php
require '../global.php';
$pdo = New Database();
$account->IPisBanned($_SERVER['REMOTE_ADDR']);
$account->isConnected();

if(!empty($_POST['username']) AND !empty($_POST['password'])) {

    $bdd = $pdo->query('SELECT * FROM users WHERE username = ?', [$core->F_HTML($_POST['username'])]);


    $iterations = 10000;
    $length = 40;
    $secret = "at_least_16_byte";
    $salt = $secret.$_POST['username'];
    $hash = hash_pbkdf2("sha1", $_POST['password'], $salt, $iterations, $length);
    $hash = strtoupper($hash);


    if($bdd->rowcount() == 1) {

        $req = $bdd->fetch();

        if(password_verify($hash, $req['password'])) {

            $account->UserisBanned($core->F_HTML($_POST['username']));
            $_SESSION['id'] = $req['id'];
            $account->Update($_SESSION['id']);

            echo 'success';

    } else {
            echo 'The password is incorrect.';
        }
    } else {
        echo 'The username does not exist.';
    }
} else {
    echo 'The required fields are empty.';
}
?>

Я сильно запутался, я часами пытался это исправить, но я действительно не могу. Спасибо за ваше время :) 1020 *

1 Ответ

1 голос
/ 23 февраля 2020

Похоже, что password_verify ожидает, что первым параметром будет обычный текст пользователя пароль.

Попробуйте:

password_verify($_POST['password'], $req['password'])

ПРИМЕЧАНИЕ. и strtoupper.

https://www.php.net/manual/en/function.password-verify.php

Обратите внимание, что password_ha sh () возвращает алгоритм, стоимость и соль как часть возвращенных га sh. Поэтому вся информация, необходимая для проверки ха sh, включена в него. Это позволяет функции проверки проверить ha sh, не требуя отдельного хранилища для соли или информации алгоритма.

/**
 * (PHP 5 &gt;= 5.5.0, PHP 5)<br/>
 *
 * Checks if the given hash matches the given options.
 * @link https://secure.php.net/manual/en/function.password-verify.php
 * @param string $password The user's password.
 * @param string $hash A hash created by password_hash().
 * @return boolean Returns TRUE if the password and hash match, or FALSE otherwise.
 * @since 5.5.0
 */
function password_verify ($password, $hash) {}

Если вы не хотите этого делать, вы можете удалить password_verify и сделать:

`if ($hash === $req['password'])`
...