2010-11-09 4 views
1

Я использую salt для шифрования паролей моих пользователей. Я использую 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); 
?> 

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

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

ответ

3

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

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

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

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

+0

Спасибо, вот что я сделаю. Я храню соль в файле конфигурации. Я читал много людей, говорящих, чтобы хранить соль в дБ, но я не чувствовал себя комфортно с ней.Просто разорвать db был скомпрометирован. – Mario

+1

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

+0

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

0

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

-2

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

+0

Хорошо. Значит, у вас нет случайной сгенерированной соли? Использовать постоянную соль? Ive прочитал много людей, сохраняющих солонку в дБ. Это хорошая практика? – Mario

+1

Соль, по определению, - это * не * постоянная, а случайная величина. http://stackoverflow.com/questions/1645161/salt-generation-and-open-source-software/1645190#1645190 – Jacco

+0

@ Jacco постоянная часть информации, с которой идентифицируется пароль. Таким образом, в этом случае, возможно, некоторые пользовательские данные. Уникальный, а не случайный. –

8

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

Вот статья, которая содержит больше информации: Storing Passwords - done right!

И для получения дополнительной информации о соли: salt-generation-and-open-source-software

+0

Не знаете, почему это было бы downvoted ... –

+0

Соль должна быть случайной. (если это не случайно, мы называем это ключом) http://stackoverflow.com/questions/1645161/salt-generation-and-open-source-software/1645190#1645190 – Jacco

+3

Абсолютно. Из этой публикации: «Используйте новую соль при создании нового пароля или изменении пароля». Я согласен с тем, что вам нужно вычислять новую уникальную соль каждый раз, когда генерируется пароль. Тогда вы можете сохранить эту соль в базе данных, как я и предложил. Я вижу, как мой ответ на самом деле не объяснил это четко, поэтому я пересмотрел его ... –

0

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

0

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

$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 
} 

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

+1

вы должны сначала получить соль из db вместо отправки не-хэшированного пароля в db. – Jacco

Смежные вопросы