шифрование пароля: когда его слишком много? - PullRequest
0 голосов
/ 29 июня 2011

Я обновляю свою библиотеку функций helper.Мне интересно, слишком ли много salt в шифровании пароля?

Есть ли разница между:

mb_substr(sha1($str . AY_HASH), 5, 10) . mb_substr(sha1(AY_HASH . sha1($str . AY_HASH)), 5, 10) . mb_substr(md5($str . AY_HASH), 5, 10)

и просто:

sha1(AY_HASH . sha1($str . AY_HASH))

AY_HASH является salt.Что я должен предпочесть, и если ни один из них не является хорошим, что является лучшей альтернативой?

Ответы [ 2 ]

5 голосов
/ 29 июня 2011

Для каждого пароля должна быть сгенерирована , а не секретная строка, используемая для каждого пароля.Повторное использование соли означает, что злоумышленнику потребуется создать только одну радужную таблицу для каждого пароля, а не одну для каждого пароля.

Я предлагаю вам прочитать предыдущий ответ, который я написал на безопасное хеширование .Правила просты:

  • Do НЕ использовать одну соль для всех паролей.Используйте случайно сгенерированную соль для каждого пароля.
  • Do NOT перефразируйте неизмененный хеш (проблема коллизий, см. Мой предыдущий ответ , вам нужен бесконечный ввод для хеширования).
  • Do NOT попытаться создать собственный алгоритм хеширования или алгоритмы сопоставления миксов в сложную операцию.
  • Если застряли с поврежденными / незащищенными / быстрыми примитивами хеширования, используйте усиление ключа .Это увеличивает время, необходимое злоумышленнику для вычисления таблицы радуги.Пример:

function strong_hash($input, $salt = null, $algo = 'sha512', $rounds = 20000) {
  if($salt === null) {
    $salt = crypto_random_bytes(16);
  } else {
    $salt = pack('H*', substr($salt, 0, 32));
  }

  $hash = hash($algo, $salt . $input);

  for($i = 0; $i < $rounds; $i++) {
    // $input is appended to $hash in order to create
    // infinite input.
    $hash = hash($algo, $hash . $input);
  }

  // Return salt and hash. To verify, simply
  // passed stored hash as second parameter.
  return bin2hex($salt) . $hash;
}

function crypto_random_bytes($count) {
  static $randomState = null;

  $bytes = '';

  if(function_exists('openssl_random_pseudo_bytes') &&
      (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')) { // OpenSSL slow on Win
    $bytes = openssl_random_pseudo_bytes($count);
  }

  if($bytes === '' && is_readable('/dev/urandom') &&
     ($hRand = @fopen('/dev/urandom', 'rb')) !== FALSE) {
    $bytes = fread($hRand, $count);
    fclose($hRand);
  }

  if(strlen($bytes) < $count) {
    $bytes = '';

    if($randomState === null) {
      $randomState = microtime();
      if(function_exists('getmypid')) {
        $randomState .= getmypid();
      }
    }

    for($i = 0; $i < $count; $i += 16) {
      $randomState = md5(microtime() . $randomState);

      if (PHP_VERSION >= '5') {
        $bytes .= md5($randomState, true);
      } else {
        $bytes .= pack('H*', md5($randomState));
      }
    }

    $bytes = substr($bytes, 0, $count);
  }

  return $bytes;
}

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

0 голосов
/ 29 июня 2011

Разницы нет.Предполагая, что соль уникальна для каждого пользователя, вы хотите многократно хэшировать (обычно 1000 ~ 10000 раз).Это усиливает хэш на количество повторений хеша.

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

...