#php #security #hash #cryptography #passwords
#php #Безопасность #хэш #криптография #пароли
Вопрос:
Мне сказали, что php mcrypt устарел, и я должен использовать другой метод для хэширования и соления своих паролей.
Это то, чем я занимаюсь в настоящее время:
public function saveNewUser(array $data) {
$passwd = $this->mysqli->real_escape_string($datas['passwd']);
$options = [
'cost' => 11,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
];
$hashed_passwd = password_hash($passwd, PASSWORD_BCRYPT, $options);
$this->optin_hash = md5(rand());
//...
//save user in DB with hashed passwd
Вход:
if (password_verify($_POST['user_password'], $result_row->gmw_usr_passwd)) {//do some login stuff}
1.) Какой самый последний и безопасный способ зашифровать и сохранить пароль? Можете ли вы привести пример использования или ссылку, как правильно сохранить пароль crypt и как проверить его для входа?
2.) В документальном фильме по php я прочитал кое-что о password_hash:
password_hash() создает новый хэш пароля, используя надежный алгоритм одностороннего хэширования. password_hash() совместим с crypt(). Следовательно, хэши паролей, созданные crypt(), могут использоваться с password_hash().
(…)
Предупреждение Параметр salt устарел с версии PHP 7.0.0. Теперь предпочтительнее просто использовать соль, которая генерируется по умолчанию.
2.a) Является ли password_hash альтернативой тому, что я использовал?
2.б) Значит, мне не нужно добавлять соль самостоятельно?
2.c) Что насчет алгоритма blowfish, который я использовал, и всех других шагов, которые я добавил? Они больше не нужны?
2.d) как мне проверить пароли для входа, когда я использую password_hash?
РЕДАКТИРОВАТЬ: Извините, я увидел, что уже использую password_hash (это была очень короткая ночь кодирования).
Как описано Артджомом Б. Мне не нужен mcrypt (?)
Комментарии:
1. Вам не нужен mcrypt для генерации случайных байтов. Расширение OpenSSL имеет аналогичную функцию.
2. Значит, я просто удаляю эту опцию? Я бы использовал это вместо: $options = [‘cost’ => 11];
3. Ну, это зависит от ваших требований к соли. Если вам действительно нужна соль определенной длины, которая отличается от стандартной, то вы не можете просто использовать значение по умолчанию, не так ли? Хотя по умолчанию все в порядке, и я не вижу причин не использовать его.
4. Лучше всего опустить параметр salt, функция
password_hash()
сгенерирует параметр save самостоятельно. Соль, созданная с помощьюmcrypt_create_iv()
, в любом случае не подходила для BCrypt.5. 1. Не передавайте соль. Просто позвольте
password_hash()
сгенерировать его. 2. В других местах, где вам нужна случайность, используйтеrandom_bytes()
. Если вам нужен ваш код для работы в проектах PHP 5, возьмите копию github.com/paragonie/random_compat и на сегодня хватит.
Ответ №1:
Согласно документации PHP для PHP 7.0, новый стандартный способ заключается в использовании password_hash для хэширования исходного пароля, а затем password_verify во время входа в систему для проверки правильности предоставленного пароля.
Эти функции являются оболочками вокруг основных принципов, таких как crypt (), и рекомендуются, потому что они заботятся о вещах, о которых вы и я никогда не подумаем, например, о выборе правильного источника случайности для генерации соли (вы не можете использовать стандартную функцию rand для шифрования).
Переходя к 2b и остальным, вам не нужно добавлять соль самостоятельно, потому что она сгенерирована PHP и включена в пароль, и все необходимые шаги выполняются за вас.
Вам просто нужно сохранить хэшированный пароль, созданный с помощью password_hash, в базе данных, а затем использовать его во время входа в систему для сравнения с предоставленным пользователем паролем с помощью password_verify.
Кроме того, да, mcrypt устарел, потому что он больше не обновляется.
Комментарии:
1. Спасибо за ваше объяснение! Как я уже спрашивал выше: Итак, я просто удаляю эту строку: ‘salt’ => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM) И все?
2. Или мне просто использовать: password_hash($ passwd) и все готово?
3. Если вы хотите продолжать использовать cost, вы могли бы просто удалить строку о salt и сохранить строку о cost. Кроме того, я не уверен, что вы в курсе, что PASSWORD_BCRYPT на самом деле использует blowfish, поэтому PASSWORD_DEFAULT — это уже bcrypt, а не простая функция хэширования, такая как md5 или sha. Итак, вы могли бы просто использовать password_hash($ passwd, PASSWORD_DEFAULT).