защита паролей пользователей php - PullRequest
0 голосов
/ 24 мая 2011

Я тестирую несколько комбинаций sha1 и md5:

<?php
$test = 'fail test';
echo nl2br ("Text: $test\n");
echo nl2br ("md5: ".md5($test)."\nsha1: ".sha1($test)."\nsha1(md5): ".sha1(md5($test))."\nmd5(sha1): ".md5(sha1($test)));
?>

Выход:

Text: fail test
md5: 748410d0085967c496d54dd8fcbecc96
sha1: d730125e8cb8576459173655148fb6896ef44c09
sha1(md5): faa3ebeecfec45e509e93e6b245a69e2a78785ea
md5(sha1): b48e89b85c350c91eb302c1de96d4249

Какой из них лучше, или, может быть, пользователь что-то еще? Если да, то что тогда?

Ответы [ 3 ]

2 голосов
/ 24 мая 2011

Обе они являются криптографическими хеш-функциями, которые работают только однонаправленно, основное отличие состоит в том, что размер вывода MD5 составляет 128 бит, тогда как SHA-1 составляет 160 бит.Короче говоря, я не вижу, чтобы они сильно различались в использовании, несмотря на то, что MD5 более распространен в наши дни.

Любопытно, что я не могу реально увидеть, как md5 ($ text) отличается от md5 (sha ($text)) когда все они зашифрованы в 32-символьную строку, как быть с md5 ($ text. "token"), например?

И что вы подразумеваете под лучше?Это лучше выглядит или больше безопасности?См. bcrypt , если вы предпочитаете безопасность :) Википедия: http://en.wikipedia.org/wiki/Bcrypt

1 голос
/ 24 мая 2011

Хэширование хэша не добавляет дополнительной безопасности.(На самом деле, это может усугубить ситуацию, если у человека есть таблица поиска хэш-хэша.)

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

Всегда хэшируйте свои пароли с помощью соленого ключа.Этот ключ должен быть уникальным для каждого пароля.Это не должно быть сохранено в частном порядке.Назначение защищенного пароля состоит в том, что хакер, получивший доступ к вашей базе данных, не может просто сравнить хеш с известным списком хешей, которые соответствуют обычным паролям.Вместо этого он должен попытаться взломать пароль, используя все возможные пароли.

Используя уникальную соль для каждого пароля, вы гарантируете, что каждый хэш в базе данных различен, даже если они используют один и тот же пароль.

Чтобы получить пароль, просто создайте случайную строку символов и добавьте ее к паролю.Вот пример хеша с 48-битной солью и sha-256:

function make_password($password)
{
  # random 48-bit salt (8 chars when base64 encoded)
  $salt = base64_encode(pack('S3', mt_rand(0,0xffff), mt_rand(0,0xffff), mt_rand(0, 0xffff)));

  return $salt.hash('sha256', $salt.$password);
}

function check_password($password, $hash)
{
  $salt = substr($hash, 0, 8);
  return hash('sha256', $salt.$password) == substr($hash, 8);
}

$password = 'password';
$hash = make_password('password');

echo $hash."\n";

var_dump(check_password('password', $hash));
var_dump(check_password('wrong', $hash));

Каждый раз, когда вы запускаете его, хеш будет отличаться.Чтобы подтвердить пароль, выберите строку, в которой совпадает имя пользователя, а затем вызовите check_password($password_from_user, $hash_from_db).

Вот пример выходных данных:

AzrD1jZzc693714a43ad5dfd4106c0a620ef23ff9915070711fa170a6670b8164862b496
bool(true)
bool(false)

Вы можете использовать более крупную соль или более сильный алгоритм хеширования, если хотите.Но, как минимум, я бы использовал что-то вроде выше.

1 голос
/ 24 мая 2011

Вы должны солить свои пароли, ВСЕГДА.Это не останавливает грубую силу через форму входа в систему, но если кому-то удастся получить детали, взломать их будет намного сложнее (радужные таблицы будут бесполезны, если им тоже не удастся получить вашу соль)

По сути,если вы добавляете исходные данные или искажения контролируемым образом, это немного повысит безопасность.Никто не может изменить хеш, но они могут найти другие входные данные, которые соответствуют хешу.Манипулирование пользовательским вводом усложнит вход в систему для хакеров.

Например, если проход пользователя равен 123456, если вы добавите к нему соль «соли», чтобы он стал 123456 солью, MD5 этого значения будет 207acd61a3c1bd506d7e9a4535359f8a.Хакер может взломать это, чтобы стать 123456salt, но когда дело доходит до использования этого в вашей форме входа в систему, ваш код снова добавит соль, и вход в систему не удастся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...