На crackstation.net сказано:
Проверка пароля
- Как отправить безопасные запросы AJAX с PHP и jQuery
- Может ли случайный сон предотвратить временные атаки?
- Как защитить файл .env в laravel 5.4?
- Включить Captcha после нескольких попыток входа в систему - Как это реализовать?
- PHP, .htaccess, защита от DDoS и быстрого запроса
- Где я должен разместить mysql_real_escape_string?
- Извлеките соль пользователя и хэш из базы данных.
- Подготовьте соль к данному паролю и используйте его с помощью той же функции хэш-функции.
- Сравните хэш данного пароля с хешем из базы данных. Если они совпадают, пароль правильный. В противном случае
Неверный пароль.
Однако в исходном коде, указанном в нижней части страницы, я не могу понять, как функция validate_password
учитывает соль. Я имею в виду, где соль добавляется к данному паролю?
Вот эта функция:
function validate_password($password, $correct_hash) { $params = explode(":", $correct_hash); if(count($params) < HASH_SECTIONS) return false; $pbkdf2 = base64_decode($params[HASH_PBKDF2_INDEX]); return slow_equals( $pbkdf2, pbkdf2( $params[HASH_ALGORITHM_INDEX], $password, $params[HASH_SALT_INDEX], (int)$params[HASH_ITERATION_INDEX], strlen($pbkdf2), true ) ); }
Похоже, что номер Солта, Хэша и интерната хранится в одной строке и разделены на три строки (в массиве) в начале функции:
$params = explode(":", $correct_hash);
Порядок значений зависит от того, как определяются константы HASH_ALGORITHM_INDEX, HASH_SALT_INDEX и HASH_ITERATION_INDEX.
PHP 5.5 имеет свою собственную функцию password_hash()
готовую для создания безопасных хэшей. Как и в примере выше, результирующая строка будет содержать хэш, соль и параметр стоимости и всегда длиной 60 символов. Эти параметры извлекаются функцией password_verify()
позже, чтобы проверить пароль.
Для более ранних версий PHP существует пакет совместимости.
Я не совсем уверен, что происходит выше, поэтому позвольте мне немного объяснить хэши, это было сделано раньше, и есть источники, но я все равно поеду! Это было ново для всех нас!
Если у нас есть функция, назовите ее f
и пусть это будет наша хеш-функция, она принимает все возможные значения только для конечного числа выходов, поэтому ее нельзя отменить, это называется сюръективной функцией http: // ru.wikipedia.org/wiki/Surjection см. там больше. Как и f(x)=x^2
если f(x)=4
мы фактически не знаем, что такое x (мы знаем, что это может быть либо 2, либо 2)
Хэш имеет другой порядок, хотя из-за того, что бесконечное число (теоретические, компьютеры не могут обрабатывать самый длинный из множества всех строк, он слишком велик!) Входы на конечное число выходов.
Если я знаю, что это число штырей, предположим, предположим, что ваш номер булавки равен P
Я знаю f(P)=h
, а P – 1 из 10000 значений, от 0000 до 9999 включительно. Поэтому я могу просто сделать 10k хэшей (в худшем случае) и получить ваш штырь.
Соль представляет собой некоторое случайное дерьмо, которое детерминировано применяют к входу, поэтому предположим, что s(x)
солей х, это может быть, поместив букву «k» между каждой буквой ввода (хотя это было бы соль дерьма), но таким образом вывод s
зависит только от x
, учитывая тот же ввод, мы получаем тот же результат.
Затем вы делаете f(s(x))
чтобы получить свой хэш, таким образом, если я знаю хэш, но не знаю соль, мне нужно будет разобраться, как вы соленые сначала, если бы я знал соль Я должен был бы знать, как вы его применяли, и так далее.
Предположим, что вы сделали простую соль выше паролей, поэтому общий «пароль» становится «pkakskskwkokrkd», и у меня есть «таблица радуги» (список входов и их хэш-значений), я, вероятно, не буду иметь (соленую форму) в этой таблице, но предположим, что я знаю хэш, и что вы кладете ks между буквами, мне нужно будет повторно создать таблицу радуги, используя слова, но с ks в них, и это займет много памяти, много время ….. но тогда я могу сломать все ваши пароли (потому что соль была одинаковой для всех)
Это то, что ваша система означает «пользователи соли», таким образом, если я сломаю систему с помощью ks, только трещины в нем будут у кого-то, я должен сделать это для всех.
Теперь для некоторых PHP-кода!
Я рекомендую вам использовать соль sha512, это дает фиксированный 128-символьный (это PHP, он будет в базе данных) для любого ввода.
$hash = hash("sha512",$data);
Чтобы солить его, вы можете хэшировать его несколько раз, вы можете поместить ak между ним, если он «детерминирован» одинаковый для данного входа.
Наконец, как это работает:
Если у банка есть соленый хэш моего номера булавки, они не «ломают» его, чтобы получить номер моего номера, чтобы сравнить число, которое я ввел с ними, они соль и хэш, номер штыря, который я только что положил, и сравните значение с результатом в базе данных, если хеши одинаковы, введенные контакты совпадают.
Хеши могут сталкиваться, но это ОЧЕНЬ редко, «Эффект лавинности» изучался и был уверен, что он присутствует (терминология?) В алгоритмах хэширования, аналогичный ввод дает совершенно разные результаты.
Хэши хороши только для тестов на равенство.