Intereting Posts
Не удается получить содержимое обычной текстовой почты с помощью протокола IMAP Эхо-специфические атрибуты продукта и метаданные в корзине WooCommerce Показывая мою страну на основе моего IP, mysql оптимизирован Пропустить клавиши в массиве без значений в цикле foreach скрипт образца php для разбивки на страницы Как я могу написать в PHP функцию, которая модифицирует массив? Перевод Symfony2 с использованием trans_default_domain Почему MySQL сообщает о синтаксической ошибке в FULL OUTER JOIN? Как PHP обрабатывает переменные в ОЗУ? Создание таблицы из PHP не выполняется Повторяющиеся ключи для ассоциативных массивов PHP Значения динамической html-формы не сохраняются в базе данных PHP – filesize () возвращает пустую строку Новая установка Symfony 3: не удалось открыть входной файл: приложение / консоль в установке композитора Zend Framework 2 – Целочисленная проверка формы

Может ли кто-нибудь указать мне на хорошую реализацию пароля хеширования PHP / MySQL?

После прочтения информации о соловом пароле хэширование Id нравится реализовывать простую версию для области администрирования на сайт Im building.

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

Благодаря,

Процесс регистрации: пользователь вводит пароль. Система генерирует значение соли из случайных данных (может быть хэш времени и PID или что-то еще). Системы генерируют хеш-значение значения пароля и соли и сохраняют оба из них в таблице регистрации.

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

Пароль незашифрованного текста никогда не сохраняется в базе данных. Значение соли никогда не отображается клиенту.

Ну, вот что я буду делать:

function makeToken($length = 16) { if ($length > 16) { $ret = ''; while ($length > 0) { $ret .= makeToken(16); $length -= 16; } if ($length < 0) { $ret = substr($ret, 0, $length); } return $ret; } $stub = ''; for ($i = 0; $i < 100; $i++) { $stub .= chr(mt_rand(1, 254)); } $hash = sha1($stub); $hashLen = strlen($hash); $ret = ''; for ($i = 0; $i < $length; $i++) { $ret .= $hash[mt_rand(0, $hashLen - 1)]; } return $ret; } function makeSaltedHash($string, $salt = '') { if (empty($salt)) { $salt = makeToken(); } $hash = ''; for ($i = 0; $i < 200; $i++) { $hash = sha1($hash . $salt . $string); } return $hash . ':' . $salt; } function verifySaltedHash($string, $hash) { if (strpos($string, ':') === false) return false; list ($base, $salt) = explode(':', $hash); $test = makeSaltedHash($string, $salt); return $test === $hash; } 

Рациональное заключается в следующем:

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

Применение:

Чтобы создать хэш:

 $hash = makeSaltedHash($password); 

Чтобы проверить хэш:

 $bool = verifySaltedHash($password, $savedHash); 

Чтобы создать токен (защита CSRF, session_id и т. Д.), Вы можете сделать это несколькими способами:

Фиксированная длина:

 $token = makeToken(32); 

Случайная длина:

 $token = makeToken(mt_rand(64,128)); 

Изменить: увеличено повторение на шаге1 в функции хэширования.

 function encodePwd($salt, $string) { return sha1( $salt . $string ); } 

подумайте о сольной рандомизации на минуту. Специальное кодирование пароля.

Если у меня есть соль «случайный» и пароль «сложный», мой sha1 будет

 e55ec45f2873a04d2b888a5f59dd3f9d3bb25329 

который хранится в базе данных. Я хочу проверить это.

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

Но что, если это было случайно?

соль, когда она была сохранена: "случайные"

 SHA1: e55ec45f2873a04d2b888a5f59dd3f9d3bb25329 

соль, когда пользователь положил ее: «яблоко»

 SHA1: e07b207d77a0bd27d321552fc934b186559f9f42 

как я буду соответствовать этим?

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

имя пользователя будет работать хорошо (вам нужно будет обновить пароль, если они когда-либо изменили имя пользователя), таким образом, аутентификация может выглядеть так:

 `WHERE `username` = '&username' AND `password` = '" . encodePwd( $username, $password ) . "'"` function encodePwd( $username, $password) { // maybe modify username on a non-random basis? - like // $username = sha1( substr($username, 2)); // assuming usernames have a min-length requirement return sha1( $username . $password ) ; } 

У меня нет ссылки на доступный код, но то, что я делал в прошлом, заключается в создании рандомизированной соли – $salt = rand(1,1000000000); – и сохранить его в сеансе. Я передаю эту соль на страницу входа в систему, а затем использую JavaScript для создания SHA-хэша с паролем salt +, который отправляется, а не с открытым текстом. Поскольку соль хранится в сеансе, я могу затем использовать это, чтобы проверить, соответствует ли хеш логина хешу соли + пароля, хранящемуся в db.

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

Я бы также рекомендовал этот месяц статьи безопасности PHP, в которой много говорится о хэшировании паролей и безопасности хэшей.

Есть так много способов создать солонку, но я думаю, вам не нужно много думать о своей соли.

Я хэш-пароли, подобные этому

 $hash = sha1(strlen($password) . md5($password) . $salt); 

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

 function salt($lenght = 9) { $numbers = '0123456789'; $chars = 'qwertzuiopasdfghjklyxcvbnm'; $password = ''; $alt = time() % 2; for ($i = 0; $i < $length; $i++) { if ($alt == 1) { $password .= $chars[(rand() % strlen($chars))]; $alt = 0; } else { $password .= $numbers[(rand() % strlen($numbers))]; $alt = 1; } } return $password; } 

код прост, и дан heberden уже предоставил его.

соль – это просто фрагмент текста, который вы добавляете или добавляете к паролю, прежде чем генерировать хэш. например, если ваш пароль «пароль», а соль – «соль», то хеш будет hashFunction('saltpassword') вместо hashFunction('password') .

соли, как правило, используются для предотвращения трещин в радужных паролях – здесь проверяется большой список паролей и их хэшей на хешированный пароль. например, в приведенном выше примере, скажем, есть хеш 123456, который соответствует hashFunction('password') , если злоумышленник знает, что ваш хэш составляет 123456, тогда они знают, что ваш пароль является «паролем».

ваша соль должна быть случайной строкой букв и цифр – например, kjah !! sdf986. очень маловероятно, чтобы у кого-то был стол с радугой, включая kjah !! sdf986password, так что даже если кто-то получит ваш хешированный пароль, тогда это бесполезно.

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

Не могли бы вы использовать встроенную функцию crypt(...) ?

… Применение …

 crypt('rasmuslerdorf', '$1$rasmusle$') 

… Результат …

 MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0 

… В документации есть больше примеров и других хэш-методов.