C # и SQL Server: пароли. Где делать что? - PullRequest
3 голосов
/ 26 января 2009

Хорошо, у меня есть приложение, написанное на C #. У нас есть данные в SQL Server. Среди этих данных у нас есть учетные записи пользователей, которые дадут доступ к приложению.

Я прочитал вокруг, и я знаю, что вы должны солить и хэшировать и, возможно, хэшировать несколько раз и т. Д. Но где мне это делать? Что я отправляю на и с SQL Server? Что именно я храню в базе данных? Я хэширую это в SQL? (возможно, там есть хеш-функция, как в mysql?) Должен ли я хешировать и делать причудливые вещи в своем коде? Отправляю ли я хеш на сервер и сравниваю или получаю хеш с сервера и сравниваю в моем приложении? А как насчет соли? Где я могу это сделать? Где я могу хранить это? Как мне это получить?

Другими словами, может ли кто-нибудь дать мне хорошее и понятное описание сценария входа в систему (и, возможно, сценария добавления / сброса пароля пользователя). Что, где, что, где следует использовать и т. Д.

Надеюсь, что кто-то может прояснить это для меня =)

Ответы [ 4 ]

6 голосов
/ 26 января 2009

Для C # + SQL Server вы можете просто использовать модель MembershipProvider, которая позаботится обо всем этом за вас.

И IMO, самая важная часть правильного понимания всего этого - это не делать это самостоятельно . Скорее, положитесь на механизм, предоставляемый вашей платформой. Это так легко понять неправильно, что выглядит для работы. Затем вы развертываете, и вы даже не знаете, что что-то не так, пока после вас не взломают.

1 голос
/ 26 января 2009

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

  1. Сохраните хэш и соль в базе данных.
  2. Создайте хеш и соль в своем собственном коде. Таким образом, вы не привязываете себя к конкретной базе данных.
  3. Никогда не отправляйте пароль по сети в виде открытого текста. Я бы порекомендовал извлечь хеш и соль из базы данных и сравнить ее с теми, которые вы вычислили по имени пользователя и паролю, предоставленным стороной, которая желает пройти аутентификацию.
0 голосов
/ 26 января 2009

Я сделал это сам несколько лет назад, до того, как была доступна модель поставщика членства.

Мы использовали встроенные в ASP.NET функции для обработки хэширования пароля; это статический метод HashPasswordForStoringInConfigFile в пространстве имен FormsAuthentication. Вы даете ему пароль и выбор шифрования, и он возвращает хешированный пароль.

Наш поток был: - Получить хешированный пароль из базы данных для введенного имени пользователя. - Хэш введенного пароля. - Они совпадают? Если это так, продолжайте, иначе вход не удался.

При смене пароля мы отправили хеш в базу данных для хранения; мы не отправили незашифрованный пароль.

И, я полагаю, это то, что делает MembershipProvider сегодня под прикрытием.

Еще раз повторюсь, что самая важная часть при выполнении проверки подлинности на основе форм независимо от того, как вы это делаете, - это работа через безопасное (HTTPS) соединение.

0 голосов
/ 26 января 2009

Если вы используете ASP.NET, то использование встроенного членства - это легкая реализация, я бы порекомендовал пойти по этому пути.

Однако, как общий вопрос, я бы реализовал хеширование в вашем локальном коде, а затем только отправил бы значения хеш-функции в базу данных. Для солей есть несколько способов сделать это, вы можете создать случайную соль, или вы можете солить значение, используя идентификатор записи, или что-то еще. Опять же, я бы сделал это в коде C #. В рамках есть полезный метод для этого.

...