Лучшая практика для обеспечения имени пользователя/пароля между клиентами и сервером

Получил приложение (C# WPF), который должен "звонить домой" и получить обновленный материал от домашнего сервера. В теории могли быть тысячи клиента там, будучи должен связаться по общедоступному Интернету.

Каждый пользователь сначала зарегистрируется в имени пользователя и пароле. Затем как выполнение приложения, это призовет домой время от времени к информации о новых версиях, новостях, комментариях, сообщениях для пользователя и другом специализированном материале. Это не будет приложением для "всех", но, как упомянуто, могло все еще быть довольно много пользователей - таким образом, безопасность является приоритетом. Я хочу, чтобы это было очень, очень трудно ворваться, но, если невозможный опция, я пойду для этого также.:)

Существует только несколько основных операций, которые должны поддерживаться;

  • Первичная регистрация нового пользователя
  • Проверка имени пользователя и пароля
  • "Новые функции и возможности начиная с [МЕТКИ ВРЕМЕНИ]?" операция
  • Клиент, добавляющий комментарии, сообщения или другой позволенный пользовательский контент

Сторона сервера вещей будет на сервере Win2008 с IIS7. У меня нет почти знания, я должен с WCF реализовать это во время, которое я имею для проекта, таким образом, я сделаю некоторое волшебство ASP.NET MVC 2 с XML-файлами назад и вперед. Если все, что Вы имеете, является молотком..

То, что я ищу, является советом относительно того, как сделать это максимально надежно, не лишая возможности использовать. Конфигурация на стороне клиента будет сохранена в XML-файле. На стороне сервера большинство вещей будет жить в SQL-сервере.

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

  • На стороне клиента пароль должен быть сохранен как хеш, который я предполагаю? Или зашифрованный, со способом вернуть его?
  • Я думаю HTTPS между клиентом и сервером для хорошего уровня безопасности по умолчанию. Плохая идея? Нет?
  • Действительно ли необходимо на самом деле "войти в систему" с этой моделью? Комбинация имени пользователя/пароля должна быть отправлена с каждым запросом?
  • Если я иду для https, который достаточно безопасен в той точке? Или я должен все еще зашифровать часть материала аутентификации?
  • Существует ли точка к серверу, обеспечивающему некоторое шифрование "маркер", который может использоваться в качестве соли (я не действительно знаком с терминологией здесь) далее зашифровать имя пользователя/пароль?
  • В основном, как я могу защитить эту систему до такой степени, когда, никто вне клиента или машин сервера не может украсть сведения об учетной записи? Я понимаю, конечно, что, если плохие парни хватают надлежащего конфигурационного файла, то та учетная запись поставлена под угрозу. Эта система никогда не будет, конечно, позволять никаким критическим операциям происходить с помощью этой коммуникации, все, что произойдет на сервере; однако, я рассматриваю учетную запись, взламывающую очень очень плохую вещь, которой я должен принять каждую возможную меру для предотвращения.

Какие-либо хорошие идеи?

Спасибо!

8
задан Rune Jacobsen 10 August 2010 в 17:28
поделиться

3 ответа

У вас есть две отдельные проблемы: аутентификация зарегистрированного пользователя и создание новой учетной записи.

Аутентификация пользователя

Это простая часть. У вас есть несколько вариантов:

  • HTTP-аутентификация ( базовая или дайджест ). Базовый - это шутка, поэтому в качестве серьезной альтернативы он оставляет только дайджест.
  • HTTP NTLM / Kerberos-аутентификация (также известная как встроенная аутентификация Windows) является пуленепробиваемой, если ваши клиенты присоединены к домену NT (маловероятно).
  • Взаимная аутентификация SSL / TLS
  • Аутентификация HTTP с помощью форм. Не стоит и упоминать.
  • Базовая аутентификация или проверка подлинности с помощью форм по защищенному каналу ( HTTPS )

Таким образом, остаются реальные варианты: дайджест, взаимный SSL или базовая / форма по зашифрованному каналу.

HTTP Digest очень легко реализовать на стороне клиента, просто добавьте имя пользователя и пароль в CredentialCache , используемый с WebRequest , и все готово. Повторно используйте экземпляр CredentialCache между вызовами, чтобы получить преимущества от предварительной аутентификации. К сожалению, на стороне сервера дела обстоят не так радужно: дайджест-аутентификация поддерживается должным образом только при интеграции с AD, см. Настройка дайджест-аутентификации .

Взаимная аутентификация SSL / TLS поддерживается как клиентом, так и сервером, но опять же, серверная сторона действительно поддерживает ее только при интеграции с AD, а не реальный вариант (см. Настройка аутентификации сопоставления сертификатов клиента ]).

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

Теперь верно, что вы можете «улучшить» схему аутентификации с помощью форм, чтобы делать довольно сложные вещи, в основном проектируя дайджест-эквивалент при обмене формами HTTP, но я считаю, что это выходит за рамки этого обсуждения. И если вы решитесь пойти по этому пути, вам следует действительно знать, что вы делаете, или использовать хорошо зарекомендовавшее себя решение (я не знаю ни одного).

Сохранение пароля: Для Basic / Digest / Forms клиент не сохраняет пароль, поскольку пароль фактически предоставляется пользователем. В лучшем случае пароль может быть сохранен, чтобы избежать повторного ввода, и это следует делать так же, как любой секрет пользователя, хранящийся на клиенте, зашифрованный с помощью DPAPI через класс ProtectedData . На стороне сервера, если используется таблица пользователей, пароли должны храниться как односторонний хэш. Для Basic и Form подойдет любая схема хеширования (желательно солёная). Но для дайджеста хеш должен быть хешем HA1 из схемы дайджеста: md5 (имя пользователя: область: пароль) , чтобы сервер мог завершить квитирование аутентификации.Хотя для этого требуется довольно агрессивное переписывание готовых поставщиков членства, которые поставляются с ASP, я все же рекомендую этот способ.

Инициализация пользователя

Это немного сложнее, поскольку включает в себя установление начального доверия. Если вы просмотрите все схемы, упомянутые выше, вы увидите, что ни одна, кроме Basic / Forms через HTTPS, не может сделать это внутри полосы: любое другое решение требует первоначального развертывания учетной записи пользователя, настроенной внешними средствами ( где внеполосные относятся к используемой схеме). Взаимный SSL требует предоставления сертификата, NTLM / Kerberos требует предоставления пользователя AD, дайджест требует предоставления пароля пользователя. Для Basic / Forms и Digest существует удобное внеполосное решение: безопасный канал HTTPS, по которому отправляется форма для создания учетной записи. Для сертификатов SSL / TLS и для AD все сложнее.

OpenID / OAuth

Совершенно другой подход - делегировать аутентификацию. Используйте OpenID с такими поставщиками, как Google или Yahoo, и OAuth с такими поставщиками, как Facebook или Twitter. Это феноменально хорошо работает с веб-приложениями (сам StackOverflow использует такую ​​схему, как вы могли заметить, см. OpenID, One Year Later ). Существуют библиотеки и поставщики интеграции, которые действительно упрощают эту задачу, как 3 щелчка мышью и одна строка кода, например JanRain .

Единственная проблема с OpenID и OpenAuth заключается в том, что это интерактивная схема. Он работает только в том случае, если пользователь активно участвует в процессе входа в систему / аутентификации и, таким образом, устраняет все автоматизированные решения.Если ваше приложение выполняет какие-либо фоновые операции (например, работает в качестве службы) или использует идентификатор приложения для «домашнего телефона» без участия пользователя, тогда OpenID / OAuth не работает.

5
ответ дан 5 December 2019 в 20:11
поделиться

Я думаю, что это ответит только на «шифрование» вашего вопроса, но я только что прочитал сегодня утром отличную статью о шифровании в Silverlight и .NET, которые могут использоваться для защиты конфиденциальной информации:

Вот часть содержания статьи:

Первым шагом, конечно же, является поиск достаточно надежного протокола шифрования, который может быть реализованным как в Silverlight, так и в .NET, и быть полностью совместимым между обоими временами выполнения. Я собираюсь использовать шифрование AES. AES расшифровывается как «Advanced Encryption Standard». Этот стандарт широко используется и одобрен правительством США и органами по стандартизации.

1
ответ дан 5 December 2019 в 20:11
поделиться

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

  • определения уязвимостей
  • определения векторов атак
  • определения возможных контрмер

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

Несмотря на то, что существуют передовые методы обеспечения безопасности, вы не можете просто следовать рецепту, чтобы защитить систему.

Хотя в целом вы упоминаете некоторые разумные контрмеры для защиты приложения (хеширование паролей, HTTPS), дьявол кроется в деталях. Иногда вам приходится рассматривать такие сценарии, как:

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

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

Microsoft опубликовала документ, называемый Security Жизненный цикл разработки (SDL) , который вы, возможно, захотите изучить. Также на MSDN есть целый раздел Security Engineering , в котором есть много справочной информации и рекомендаций по этой теме.

2
ответ дан 5 December 2019 в 20:11
поделиться