2012-04-27 5 views
0

Итак, я изучаю PHP и работаю на странице входа. Я уже понял, как зарегистрировать нового пользователя, используя SHA256 для хеша $ salt + $ password. Я знаю, что существуют более медленные методы шифрования, такие как bcrypt, но для учебных целей я просто использую SHA256. Мой вопрос, после использования его для шифрования:Извлечение соли + хэш из БД для проверки

function HashPassword($password) { 
    $salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); 
    $hash = hash("sha256", $salt . $password); column 
    $final = $salt . $hash; 
    return $final; 
} 

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

function ValidatePassword($password, $hash_pass) { 

    $salt = substr($hash_pass, 0, 64); 
    $trueHash = substr($hash_pass, 64, 64); 
    $reHash = hash("sha256" , $salt . $password); 

    return $reHash == $trueHash; 
} 

ответ

1

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

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

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

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

Для вас, как кодировщик, который хочет, чтобы проверить учетные данные, которые Вы должны следовать следующей схеме:

  1. Получить соль, сохраненный в базе данных.
  2. Вычисляется имеет значение каскадного hash = salt + password
  3. Сравнить вычисленный имеют с сохраненным hash === savedHash
  4. Если они совпадают, это был правильный пароль. Если нет, это был неправильный пароль.
+0

Да, я понимаю концепцию и благодарю вас за дополнительное разъяснение. Что меня отключает, так это как мне получить доступ к конкатенированному хэшу, который находится в моей БД. выберите из имени пользователя пароль, где username = '$ username'? – Jukodan

+0

@ Jukodan вы можете сделать один запрос для извлечения как соли, так и хэшированного пароля: 'SELECT hashedPW, salt FROM users WHERE username = '$ username''. Затем сравнение выполняется в PHP. Важным моментом является наличие разных солей для каждого пользователя, а не глобального (комментарий к другому ответу звучит так, как будто у вас есть только одна «соль» для всех пользователей). – Sirko

+0

Ах! Я уже думал об этом, главным образом потому, что, когда я запросил базу данных и повторил результат, я получил «ресурс ID # 2» вместо ожидаемого хэшированного пароля. В настоящее время я использую: $ salt = bin2hex (mcrypt_create_iv (32, MCRYPT_DEV_URANDOM)); , чтобы создать случайную соль для каждого пользователя, а затем сохранить хэш = соль + пароль в одном столбце. – Jukodan

5

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


EDIT

Глядя снова на вашей HashPassword функции, я понимаю, что вы не хотите, чтобы произвести в нем случайную соль, а скорее принять $salt в качестве аргумента; вы либо передадите значение из вашей существующей записи базы данных, либо перейдете в случайном порядке, если это необходимо.

+0

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

+3

@ Джукодан: Ваша соль должна храниться вместе с вашей записью. – eggyal

+0

Я сохраняю свою соль как глобальную переменную класса (private) в сценариях include, в которых мне нужен хэш + соль. Просто возьмите их введенный пароль, добавьте в него свою соль, сохраните его в переменной, извлеките свой уже хэшированный пароль из db и сравните их.Если они совпадают, тогда вы золотые, если нет, то они ввели неправильный пароль –

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