Intereting Posts
CakePHP: Нет такого файла или каталога (попытка подключения через unix: ///var/mysql/mysql.sock) Как обмениваться сеансом между приложением php и Java EE? как отправить файл через функцию curl в php? предотвращение подделки подпроса в URL-адресе Как отправлять сообщения электронной почты непосредственно на SMTP-сервер? Структура каталогов для большого количества файлов mysql Выбор из двух разных таблиц. Удалить все несоответствующие символы в строке PHP? Изменить регистрационные формы Symfony2 FOSUserBundle POST? Как запросить сводную таблицу с несколькими внешними ключами Laravel 5 Eloquent IMAP: PHP: как я могу получить и сохранить номер сообщения для удаления определенной почты Как установить UTF8 на PHP при подключении к ACCESS 2007 (ODBC) Получите пользователей новейших видео с YouTube? PHP: Как я могу использовать / использовать метод в своем классе? Как я могу определить уникальный URL-адрес для пользователя без использования их идентификатора?

Проверка правильной пароли в PHP

На crackstation.net сказано:

Проверка пароля

  • Извлеките соль пользователя и хэш из базы данных.
  • Подготовьте соль к данному паролю и используйте его с помощью той же функции хэш-функции.
  • Сравните хэш данного пароля с хешем из базы данных. Если они совпадают, пароль правильный. В противном случае
    Неверный пароль.

Однако в исходном коде, указанном в нижней части страницы, я не могу понять, как функция 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 ) ); } 

Solutions Collecting From Web of "Проверка правильной пароли в PHP"

Похоже, что номер Солта, Хэша и интерната хранится в одной строке и разделены на три строки (в массиве) в начале функции:

 $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 между ним, если он «детерминирован» одинаковый для данного входа.

Наконец, как это работает:

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

Хеши могут сталкиваться, но это ОЧЕНЬ редко, «Эффект лавинности» изучался и был уверен, что он присутствует (терминология?) В алгоритмах хэширования, аналогичный ввод дает совершенно разные результаты.

Хэши хороши только для тестов на равенство.