mcrypt устарел? — Как правильно зашифровать и сохранить пароль в PHP?

#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).