После прочтения информации о соловом пароле хэширование 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
… В документации есть больше примеров и других хэш-методов.