Как сравнить пароли пользователей для входа в систему с этим кодом? - PullRequest
1 голос
/ 16 декабря 2010

У меня есть некоторый код здесь для системы входа в систему, которая предназначена исключительно для целей обучения и создана при некоторой помощи великих людей stackoverflow, и мне сказали не хранить соль и хеш отдельно, а скорее вместе , Мне интересно, как я собираюсь сравнивать пароли, когда пользователь пытается войти в систему. если соль не хранится, как я могу сравнить два. Кто-нибудь может помочь?

require("constants.php");
$DBH = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

function createSalt() {
    $length = mt_rand(64, 128);
    $salt = '';
    for ($i = 0; $i < $length; $i++) {
        $salt .= chr(mt_rand(33, 255));
    }
    return $salt;
}
//Salt function created by ircmaxell

function registerNewUser() {
    //Check to see if     Username Is In Use//
    $q = $DBH->prepare("SELECT id FROM users WHERE username = ?"); 
    $username = filter_var($username, FILTER_SANITIZE_STRING);
    $data = array($username);
    $q->execute($data);
    $row = $q->fetch();

    if ($row === false) { 
        //If Username Is Not Already In Use Insert Data//
        $hash = hash('sha256', $pass);
        $salt = createSalt();
        $hash = hash('sha256', $salt . $hash . $pass);  //UPDATED
        $data = array($username, $hash, $salt);
        $qInsert = $DBH->prepare(
            "INSERT INTO users (username, password, salt) values (?, ?, ?)"
        );
        $qInsert->execute($data); //Inserts User Data Into Table//  
    }
}

Ответы [ 3 ]

2 голосов
/ 16 декабря 2010

Выполните ту же работу:

$hash = hash('sha256', $row['salt'] . hash('sha256', $pass) . $pass);
if ($row['password'] == $hash) {
    // the password is correct
}

Где $row было взято из базы данных в соответствии с именем пользователя, а $pass - это пароль, полученный из формы.

Кроме того, бессмысленно включать пароль в хеш дважды: хеш и простой текст один

$hash = hash('sha256', $salt . $pass); // this would be enough
2 голосов
/ 16 декабря 2010

Вы должны запросить вашу базу данных, чтобы получить строку пользователя (если есть), получить соль и использовать тот же алгоритм, что и пароль, предоставленный пользователем.Если оба хеша совпадают, пользователь предоставил хороший пароль.

делая какой-то код, он сделал бы что-то вроде этого:

$qSelect = $DBH->prepare('SELECT salt,password FROM users WHERE username = ?');
$qSelect->execute();
$qSelect->bind_result($salt, $db_password);
$qSelect->fetch();

if($salt == null){
  // username doesn't exist
  return;
}    

$hash = hash('sha256', $pass);
$hash = hash('sha256', $salt . $hash . $pass);  
if($hash == $db_password){
   // login ok
} else {
   // login nok
}
1 голос
/ 16 декабря 2010

Проблемы:

1) Ваш метод создания хеша пароля для хеша + соли является нетрадиционным.Это не совсем проблема, это не то, что вы хотели.zerkms ясно высказал эту мысль.

2) Для вставки вашей базы данных требуется, чтобы имя пользователя являлось уникальным столбцом и отсутствовала некоторая обработка исключений, или он уязвим для гонки, в результате которой несколько пользователей с одним именем пользователяи разные пароли (и разные идентификаторы, если это ключ)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...