безопасность паролей в 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;
?>

5 ответов


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

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

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

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

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

таким образом, вы довольно безопасны против rainbow table attack, даже если кто-то извлекает содержимое вашей базы данных.


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


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

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


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

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


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