Аутентифицировать логин пользователя с помощью соли - PullRequest
1 голос
/ 09 ноября 2010

Я использую соль для шифрования паролей моих пользователей.Я использую PHP, и вот быстрый пример того, что происходит во время регистрации пользователей.

Вот оно:

Код PHP:

    // Gives me my random key. My salt generator.
    $salt = uniqid(mt_rand());

    // My password via what users inputs.
    $userpwd;

    // Then the encryption. I use a HMAC hash.
    $encrypted = hmac_hash("sha256", $userpwd, $salt);
?>

Теперь, когда всеработает для меня в моем сценарии.Но мой вопрос, как я могу аутентифицировать пользователя, входящего в систему?Новый зашифрованный пароль является случайным, поэтому я не могу сравнить пароль из формы входа в систему с сохраненным зашифрованным паролем в базе данных.

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

Ответы [ 6 ]

8 голосов
/ 09 ноября 2010

Вам нужно сгенерировать уникальную соль для каждого пароля пользователя, а затем сохранить значение соли там, где вы сможете ее получить. Например, сохраняя соль в таблицу user вместе с именем пользователя и хэшированным паролем. Таким образом, вы можете извлечь известную соль и запустить ее через свою функцию, когда вы собираетесь аутентифицировать пользователя.

Вот статья, которая содержит больше информации: Хранение паролей - сделано правильно!

И для получения дополнительной информации о солях: Программное обеспечение для генерации соли и с открытым исходным кодом

3 голосов
/ 09 ноября 2010

Вы хэшируете введенный пользователем пароль таким же образом, затем сравниваете, совпадает ли хеш с тем, который вы сохранили.

if (hmac_hash("sha256", $_POST['password'], $saltFromDatabase) === $hashFromDatabase)
    $login = true;

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

Примечание: хеширование не такое же, как шифрование; Это необратимый процесс.

0 голосов
/ 09 ноября 2010

Вы вычисляете хэш пароля, введенного пользователем, так же, как вы делаете это при регистрации.Обратите внимание, что код является полупсевдокодом, вам нужно адаптировать его к вашим библиотекам или функциям.

$res = db('SELECT etc FROM users WHERE user=? AND pass=?',
    $_POST['user'], hmac_hash("sha256", $_POST['pass'], $salt));
if(numRows($res) > 0) {
    // continue with authentication
}

Если соль хранится в БД, то сначала нужно либо извлечь ее, либо выполнитьсравнение в БД.

0 голосов
/ 09 ноября 2010

Вы шифруете пароль, используемый для входа в систему, и сравниваете его с зашифрованным паролем в вашей базе данных. :)

0 голосов
/ 09 ноября 2010

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

0 голосов
/ 09 ноября 2010

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

...