Безопасная аутентификация пользователя - правильно ли я делаю? - PullRequest
0 голосов
/ 10 августа 2009

Я занимаюсь разработкой сайта Asp.NET для клиента и хочу убедиться, что я использую безопасную схему аутентификации.

В моей пользовательской таблице есть хэш-столбец аутентификации, который рассчитывается как sha1(salt + username + password). Сайт обслуживается через HTTPS. Для входа в систему пользователь отправляет свое имя и пароль через HTTPS. Веб-сервер вычисляет хэш и сравнивает его с сохраненным в базе данных значением для аутентификации.

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

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

Что мне делать?

Ответы [ 6 ]

7 голосов
/ 10 августа 2009

Не изобретайте велосипед, просто используйте .Net Членство .

4 голосов
/ 10 августа 2009

Это звучит достаточно безопасно? я пробежал эту схему мимо моего друга, и он сказал, что это было уязвимо для гнусные системные администраторы.

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

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

Звучит так, будто он предлагает схему «вызов-ответ» в сочетании с SSL. Это хороший подход, но позвольте мне объяснить его шаг за шагом, чтобы прояснить ситуацию.

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

hash = sha1(password + salt)

Сервер также должен хранить соль.

Когда клиент посещает страницу входа в систему, сервер должен сгенерировать запись в таблице с идентификатором и значением запроса. Затем сервер должен отправить клиенту идентификатор, сохраненную соль и значение запроса.

Когда клиент готов войти в систему, у вас должна быть функция javascript, генерирующая вызов, а также хеш-код:

hash = sha1(sha1(password + server_salt) + server_challenge + client_challenge)

Затем клиент должен передать значения hash, server_saltid и client_challenge. Затем сервер вычисляет хеш следующим образом:

hash = sha1(stored_hash + server_challenge + client_challenge)

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

4 голосов
/ 10 августа 2009

Во-первых, если пользователи подключаются через HTTPS, то не должно быть проблем с отправкой пароля на сервер по сети.

В противном случае, убедитесь, что ваша соль длинная и использует приличную энтропию для случайности. Также убедитесь, что вы используете SHA-2, а не SHA-1, поскольку SHA-1 считается неисправным .

3 голосов
/ 10 августа 2009

Читать это:
Достаточно с радужными таблицами: что нужно знать о безопасных схемах паролей

Что мы узнали?
... Если это был 2007 год, и атаки радужных таблиц подожгли вас, мы узнали, что вам следует вернуться к 1975 году и подождать 30 лет, прежде чем пытаться разработать схему хеширования паролей.
... мы должны проконсультироваться с нашими друзьями и соседями в области безопасности для помощи с нашими схемами паролей.
... в схеме хеширования паролей скорость - враг. Мы узнали, что MD5 был разработан для скорости. Итак, мы узнали, что MD5 - враг.
... если мы хотим безопасно хранить пароли, у нас есть три разумных варианта: схема PHK MD5, схема Provoc-Maziere Bcrypt и SRP. Мы узнали, что правильный выбор - Bcrypt.

Ключевые моменты здесь:

  • Что бы вы ни делали, не пытайтесь создать свой собственный код аутентификации с нуля
  • Bcrypt - ваш лучший выбор для хеширования пароля.
2 голосов
/ 10 августа 2009

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

  • Хешируйте пароль уникальной соли на клиенте через javascript, прежде чем представление.

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

2 голосов
/ 10 августа 2009

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

Вы под SSL, так что вы можете отправить учетные данные в свободном виде, поскольку строка уже зашифрована, а затем применить правила для засолки / хеширования вашего пароля для сравнения на стороне сервера. Таким образом, никто не знает, как вы шифруете свой пароль. Хранение информации в вашем клиентском javascript просто передает эту информацию.

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

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