безопасность паролей в PHP

Какой метод вы бы назвали безопасным и безопасным? Я снял эти фрагменты с php.net. Мне просто интересно, потому что люди разместили свои собственные, и я просто не мог понять, почему некоторые из них такие, как они … Может кто-то помочь мне и рассказать мне немного больше об этом? Что было бы самым безопасным и почему?

1.

<?php $hash = md5($salt1.$password.$salt2); ?> 

2.

 <?php function eliteEncrypt($string) { // Create a salt $salt = md5($string."%*4!#$;\.k~'(_@"); // Hash the string $string = md5("$salt$string$salt"); return $string; } ?> 

3.

 <?php define ('SALT_ONE', 'some_random_123_collection_&$^%_of_stuff'); define ('SALT_TWO', 'another_random_%*!_collection_ANbu_of_stuff'); $password = 'dragon'; function generate_encrypted_password($str) { $new_pword = ''; if( defined('SALT_ONE') ): $new_pword .= md5(SALT_ONE); endif; $new_pword .= md5($str); if( defined('SALT_TWO') ): $new_pword .= md5(SALT_TWO); endif; return substr($new_pword, strlen($str), 40); } echo generate_encrypted_password($password); ?> 

4.

 <? function enchsetenev($toencode,$times) { $salt = 's+(_a*'; for($zo=0;$zo<$times;$zo=$zo+1) { $toencode = hash('sha512',salt.$toencode); $toencode = md5($toencode.$salt); } return $toencode; } ?> 

5.

 <?php $hash = $password . $salt; for ( $i = 0; $i < 10000; $i++ ) { $hash = md5( $hash ); } echo $hash; ?> 

Solutions Collecting From Web of "безопасность паролей в PHP"

  1. Это основной пример того, что мы хотим, соль добавлена ​​к паролю
  2. Это тот же пример, но с частью генерации соли.
  3. Другой способ соления, но все же довольно эквивалентный
  4. Нет абсолютно никакого смысла в этом сложном примере, хеширование с помощью двух разных методов хеширования во много раз абсолютно не повышает безопасность.
  5. Как уже говорилось, абсолютно нет смысла выполнять 10000 раз хеш.

Если вы измените первый пример на:

 <?php $hash = hash('sha256', $salt1.$password.$salt2); ?> 

это будет достаточно безопасным для 99% приложения.

Единственный вопрос – как сгенерировать соль. Я рекомендую фиксированную соль ($ salt2) и соль, сгенерированную для каждого пользователя ($ salt1), которая хранится в базе данных по паролю.

Таким образом, вы достаточно защищены от атаки радужного стола, даже если кто-то извлекает содержимое вашей базы данных.

Лучшим вариантом является использование чего-то другого, кроме md5, здесь проверьте предыдущий ответ, связанный с этим.

для этого нет стандартного хорошего ответа. Я знаю, что безопасность и скорость должны быть сбалансированы. Вы могли бы AES шифровать каждую информацию, но это было бы возможно? Чтобы ответить на ваш вопрос, MD5 (который является одним из способов шифрования) плюс SALT (действительно случайная строка) считается хорошим стандартом безопасности. Это просто быстро и достаточно безопасно.

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

 <?php $hash = md5($salt1.$password.$salt2); ?> 

Этот, я думаю, подходит для большинства целей, поэтому я объясню это. Причина состоит в том, что есть две соли, потому что давайте скажем, что $ salt1 уникален для каждого имени пользователя, поэтому его столбец в пользовательской таблице (случайная строка, сгенерированная при регистрации пользователя), $ salt2 хранится в файловой системе где-то в файле config.ini, который был создан, когда приложение было установлено и оно одинаково для всех пользователей. Теперь, чтобы угадать пароль, хакеру понадобится $ salt1 и $ salt1, он может получить доступ к salt1 через sql-инъекцию, но не имеет доступа к файловой системе, где salt2 сотрет внутри config.ini, следовательно, двойная защита.

Это всего 5 способов сделать почти то же самое? Я думаю, что целью обучения здесь является понимание важности соления паролей. Лучшим способом соли является использование как можно большего количества соли, а солонка содержит как можно больше сумасшедших символов.