Лучшие практики для хранения и обновления внешних паролей API - PullRequest
9 голосов
/ 29 июня 2011

У меня есть приложение ASP.Net C #, которое должно подключаться к внешнему API с помощью WebServices каждые 5 минут.

Требования к внешнему веб-сервису следующие:

  • Требуется имя пользователя и пароль
  • Я должен передавать имя пользователя и пароль при каждом запросе веб-сервиса
  • Срок действия паролей истекает каждые 90 дней и должен быть изменен до истечения срока действия
  • Пароли не могут быть изменены вручную (человеком), мое приложение должно подключиться к отдельной веб-службе смены пароля для смены пароля.
  • Мое приложение должно генерировать каждый новый пароль на основе набора правил.
  • Пароли никогда не могут быть использованы повторно.
  • Требуются ограничения по SSL, сертификатам и брандмауэру

Я собрал все предыдущие, но у меня есть одна проблема. Какова наилучшая практика для хранения текущих и исторических паролей?

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

В идеале я хотел бы хранить каждый (зашифрованный) пароль в своей базе данных и расшифровывать его всякий раз, когда мне нужно позвонить в веб-службу. Есть ли лучшая практика, которой я должен следовать? Должен ли я шифровать каждый пароль с помощью Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Cryptographer.EncryptSymmetric (..)?

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

Ответы [ 3 ]

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

Что касается истории паролей, я бы пошел по одному из двух маршрутов:

  1. В соответствии с вашим текущим планом, храните пароли в файле / db / config - предложите использовать хешированиеалгоритм (в отличие от шифрования) для сравнения нового пароля с сохраненными хешами паролей на «равенство».

  2. Не беспокойтесь о сохранении истории паролей вообще - разрешите первую попытку ввести парольизменить веб-сервис просто не удастся, если он выберет, а затем повторно с альтернативным паролем.Таким образом, вы не дублируете бизнес-правила веб-службы смены пароля (например, допустим, они меняют его, чтобы вы могли повторно использовать пароль через 6 месяцев).

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

1 голос
/ 29 июня 2011

Самый простой способ ... использовать класс ProtectedData:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.aspx

byte[] bytes = System.Text.Encoding.UTF8.GetBytes(password);
byte[] cypher = ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser);
//... reverse
byte[] bytes = ProtectedData.Unprotect(cypher, null, DataProtectionScope.CurrentUser);
string password = System.Text.Encoding.UTF8.GetString(bytes);
0 голосов
/ 29 июня 2011

Средство регистрации ASP.NET IIS (Aspnet_regiis.exe) может шифровать и дешифровать разделы web.config.Для приложения не требуется специального кода, поскольку ASP.NET 2.0 будет магически дешифровать разделы во время выполнения.

http://msdn2.microsoft.com/en-us/library/zhhddkxy.aspx

...