Обзор функций хэширования паролей


Сейчас я просматриваю некоторые стандартные куски кода, я использую много в проектах.

В настоящее время я использую следующие функции для хэширования паролей.

function generate_salt($length = 20){
  $chars =  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.
            '0123456789``-=~!@#$%^&*()_+,./<>?;:[]{}\|';

  $str = '';
  $max = strlen($chars) - 1;

  for ($i=0; $i < $length; $i++)
    $str .= $chars[rand(0, $max)];

  return $str;
}

function hash_password($password, $salt, $iter=5) {
  $hash = sha1(sha1($password.$salt).sha1(strrev($password).strrev($salt)));

  for($i=0;$i<=$iter;++$i) {
     $hash = sha1(sha1($hash).sha1(strrev($hash)));
  }

  return $hash;
}

Я заменю и SHA1() с хэша('криптография SHA512', ).

Любые другие предложения, чтобы сделать это более безопасным / чтобы улучшить его?



232
2
задан 20 июня 2011 в 07:06 Источник Поделиться
Комментарии
1 ответ

Что такое мотивация хэширования и изменив строку несколько раз? Если у вас есть защищенные хэш-функцией, то хеширование один раз (в сочетании с достаточным количеством соли данных) вполне достаточно. Если у вас есть неуверенный в себе хеш-функция, то хеширование несколько раз-это чрезвычайно вряд ли будет достаточно, чтобы сделать его безопасным.

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

Это, конечно, реальная точка. Не тратьте много времени, пытаясь сделать свой хэш-функции умнее или более безопасный, просто убедитесь, что он делает свою работу. Провести остаток времени, глядя на остальные системы прорехи в доспехах. Система настолько сильна, как самое слабое звено в цепи, и это вряд ли будет хэш-функции. Например, может быть, вы храните функция нехешированной в PHP сессии, а на сервере настроено так, что данные сеанса чтения другими пользователями на том же поле. Может быть, вы забыли настроить HTTPS, поэтому сайт является уязвимым для снифферами. Может быть, ваш ящик корнями и злоумышленник изменил ваш PHP, так что даже если код в репозитории безупречна, все ваши пользователи находятся под угрозой.

2
ответ дан 20 июня 2011 в 09:06 Источник Поделиться