Как надежно хранить пароли при использовании разных механизмов аутентификации - PullRequest
1 голос
/ 23 ноября 2011

Для веселого проекта я хочу поддержать механизмы аутентификации SASL, особенно PLAIN и DIGEST-MD5.

У меня вопрос: как я могу безопасно хранить пароль пользователя, если мне нужно поддерживать эти два способа аутентификации?

Только с аутентификацией PLAIN это было бы очень просто, я просто сохраняю пароль с помощью bcrypt и сравниваю введенный пользователем пароль с сохраненным pw с помощью функции bcrypt_compare.

Но как я могу надежно хранить пароль, когда также возможен DIGEST-MD5? Должен ли я хранить весь рассчитанный ответ и использовать его также для сравнения PLAIN? Или есть другой способ?

// Edit : Относительно проекта "fun". На данный момент это забавный проект, но никто не знает, будет ли он в какой-то момент неинтересным. И я не хочу снижать безопасность только потому, что это веселый проект ..

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Спецификация DIGEST-MD5 сообщает вам, что сервер должен хранить для этого метода аутентификации:

3.9 Хранение паролей

Дайджест-аутентификация требует, чтобы агент аутентификации (обычно сервер) хранит некоторые данные, полученные из имени пользователя и пароль в «файле паролей», связанном с данной областью. Обычно это может содержать пары, состоящие из имени пользователя и H({ username-value, ":", realm-value, ":", passwd }), что достаточно для вычисления H(A1), как описано выше, без непосредственного разоблачение пароля пользователя.

... так что все, что вам нужно хранить для DIGEST-MD5, это H({ username-value, ":", realm-value, ":", passwd }).

Вы можете отдельно хранить хеш bcrypt, который будет использоваться для аутентификации PLAIN, или вы можете просто использовать значение DIGEST-MD5. Если бы вы хранили отдельные значения, вы могли бы разрешить своим пользователям выборочно отключать аутентификацию DIGEST-MD5, что позволит вам удалить эту (легко поддающуюся обработке) информацию из базы данных для этих пользователей.

0 голосов
/ 23 ноября 2011

Не храните пароль в открытом виде. Сохраните хеш и сравните их с хешем. Вы можете легко получить хеш с простым паролем.

Вот как создать хороший хеш:

function hash_password($password, $nonce) {
  global $site_key;
  return hash_hmac('sha512', $password . $nonce, $site_key);
}

См. Безопасный хеш и соль для паролей PHP

...