Что лучше хешировать или шифровать пароли? - PullRequest
0 голосов
/ 18 июля 2010

Что лучше для хранения паролей? Должен ли я шифровать или хешировать пароль для вашей таблицы пользователей?

Что вы предпочитаете и почему? Не могли бы вы привести пример безопасного хранения пароля.

Ответы [ 3 ]

4 голосов
/ 18 июля 2010

Учитывая, что пароли обычно не нужно проверять / хэшировать / как угодно часто (они есть, когда кто-то входит в систему и регистрируется; но это почти так) , скорость, как правило, не очень беспокойство: , что имеет значение безопасность .

Что обычно делается:

  • когда пользователь регистрируется, он вводит свой (новый) пароль
  • этот пароль соленый + хешируется, а результат сохраняется в базе данных
  • Затем, когда пользователь хочет войти в систему, он вводит свой пароль
  • То, что набрано, засолено + хешировано, и сравнивается со значением, хранящимся в базе данных.

Основной ключ : никогда не храните реальный пароль в БД - только его хеш; и посолите его перед рукой, чтобы избежать атак радужных столов .

И, кажется, это уже то, что ты делаешь - так хорошо для тебя; -)


Какую функцию хеширования следует использовать? Ну, sha1 часто считается нормальным; md5 теперь не в порядке; Я думаю, что sha512 должно быть больше, чем ОК.

1 голос
/ 18 июля 2010

Я бы сделал это обычно:

<?php

function createHash($pwd, $salt = ''){
  $hash = '';
  if(!$salt){
    $salt = hash('sha256',mt_rand().time().$pwd.'2130A');
  }
  if($pwd[0] & 0){
    if($pwd[strlen($pwd)-1] & 1){
      $hash = hash('sha256', $pwd.$salt).$salt;
    }else{
      $hash = $salt.hash('sha256', $pwd.$salt);
    }
  }else{
    if($pwd[strlen($pwd)-1] & 1){
      $hash = $salt.hash('sha256',$salt.$pwd);
    }else{
      $hash = hash('sha256', $salt.$pwd).$salt;
    }
  }
  return $hash;
}

function getSalt($pwdHash){
  if($pwd[0] & 0){
    if($pwd[strlen($pwd)-1] & 1){
      $salt = substr($pwdHash,64);
    }else{
      $salt = substr($pwdHash,0,64);
    }
  }else{
    if($pwd[strlen($pwd)-1] & 1){
      $salt = substr($pwdHash,0,64);
    }else{
      $salt = substr($pwdHash,64);
    }
  }
  return $salt;
}

var_dump(createHash('testPassword',getSalt($pwdHashFromDb)) == $pwdHashFromDb); // true
  • Соление обеспечивает более высокий уровень защиты, чем обычный хеш.
  • Положение соли зависит от введенного пароля, и, следовательно, это делает соль менее уязвимой для захвата.
  • Необработанный пароль никогда не известен и не сохраняется
  • баланс между безопасностью искорость (для сайтов).
0 голосов
/ 25 апреля 2012

Хеширование, а не шифрование паролей может помочь защитить вас от внутренних угроз.Поскольку хеш является односторонним процессом, по большей части хранимым пользователям хешированные пароли не должны быть расшифрованы.Скорее, вы можете запускать только что введенные попытки ввода пароля через одну и ту же задачу, чтобы убедиться, что результат одинаков.

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

Это может быть хорошим ответом на вопрос на собеседовании : «Как вы можете помешать вашему администратору БД со списком паролей ваших пользователей?»

Iразместил вопрос здесь https://stackoverflow.com/questions/10308694/what-is-the-right-method-for-encoding-hashed-passwords-for-storage-in-ravendb с некоторым примером кода.Хотя сам вопрос может оказаться тупым, возможно, пример кода будет вам полезен, если код на c # понятен.

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