Хеш-соль системы входа в систему

Я переписываю систему входа в систему PHP, и я только что столкнулся с этим

function createSalt()
{
    $string = md5(uniqid(rand(), true));
    return substr($string, 0, 3);
}
$salt = createSalt();
$hash = hash('sha256', $salt . $hash);

На самом деле я никогда раньше не работал с засолкой, немного поискал и нашел полезным. Но мой ответ: это хороший способ работать с солью? Разве $string = sha1(uniqid(mt_rand(), true)) не было бы лучше?

А как насчет того, чтобы вернуть только 3 символа хеша? Я действительно не понимаю.

Что думаешь?


person BernaMariano    schedule 06.06.2012    source источник
comment
Это немного лучше, чем простое хеширование. Но есть инструменты получше, например phppass или PBKDF2, которые более безопасны. Вам просто нужно убедиться, что какую бы новую функцию вы ни использовали, вы по-прежнему можете проверять старые хэши (и вы должны определять, старый или новый хеш).   -  person vstm    schedule 06.06.2012


Ответы (4)


Я предпочитаю sha1 или sha256, md5 супер-устаревший, sha-функции намного лучше. Но это мое мнение, выбирайте то, что хотите.

Что действительно важно в этом случае, так это соль. Соль всегда хранится в виде открытого текста вместе с хешем и используется для увеличения длины пароля (если вы хотите хешировать пароль, конечно, может быть что-то еще), чтобы предотвратить атаки на основе радужных / справочных таблиц. Это не защита от взлома пароля с помощью грубой силы (которая неплохо работает против md5, поэтому используйте sha256, который сложнее взломать).

Поэтому совершенно неважно, используете ли вы 32 случайных символа для хэша или что-то вроде md5 (mt_rand ()) - важна длина. Я бы использовал что-то вроде

$hash = md5(mt_rand()) . md5(mt_rand());

md5 () приводит к 32-байтовой строке, основанной на случайном числе (mt_rand () лучше, чем uniqueid ()). С этой простой строкой вы получите очень "сильный" хэш, который должен защитить каждый пароль от радужных таблиц.

person thebod    schedule 06.06.2012
comment
Ни один из этих алгоритмов (md5, sha1, sha256) не подходит для хеширования паролей, и их использование опасно; они не подходили и в 2012 году. Единственно верный вариант - настоящий алгоритм хеширования паролей, например bcrypt, scrypt или Argon2i. - person Sven Slootweg; 14.09.2017

Рассмотрите возможность использования PHP crypt () вместо того, чтобы изобретать колесо. Он специально разработан для хеширования паролей и предлагает алгоритмы хеширования, подходящие для этой цели.

person lanzz    schedule 06.06.2012

Я не согласен с данной функцией createSalt() - в основном по тем же причинам, что и вы.

Мой подход к этому был бы

define(SALT_LENGTH,32);

function createSalt()
{
  $string='';
  for ($i=0;$i<SALT_LENGTH;$i++) $string.=chr(rand(0,255));
  return $string;
}

Хорошая соль - это случайная последовательность байтов - никакие MD5 или SHA1 не имеют никакого смысла, так как хешировать нечего!

person Eugen Rieck    schedule 06.06.2012

Я не главный программист PHP, но я работал над тем же хеш-скриптом для системы входа в систему.

Я сохраняю его на GitHub - https://github.com/revitalagency/PHP5-Salt-Super-Admin

Я создал свой хеш с помощью ...

hash_hmac('sha256', $_POST['pass'], GLOBAL_SALT);

GLOBAL_SALT определен в файле конфигурации не в БД для дополнительной защиты.

person dubrod    schedule 15.08.2012