Получил приложение (C# WPF), который должен "звонить домой" и получить обновленный материал от домашнего сервера. В теории могли быть тысячи клиента там, будучи должен связаться по общедоступному Интернету.
Каждый пользователь сначала зарегистрируется в имени пользователя и пароле. Затем как выполнение приложения, это призовет домой время от времени к информации о новых версиях, новостях, комментариях, сообщениях для пользователя и другом специализированном материале. Это не будет приложением для "всех", но, как упомянуто, могло все еще быть довольно много пользователей - таким образом, безопасность является приоритетом. Я хочу, чтобы это было очень, очень трудно ворваться, но, если невозможный опция, я пойду для этого также.:)
Существует только несколько основных операций, которые должны поддерживаться;
Сторона сервера вещей будет на сервере Win2008 с IIS7. У меня нет почти знания, я должен с WCF реализовать это во время, которое я имею для проекта, таким образом, я сделаю некоторое волшебство ASP.NET MVC 2 с XML-файлами назад и вперед. Если все, что Вы имеете, является молотком..
То, что я ищу, является советом относительно того, как сделать это максимально надежно, не лишая возможности использовать. Конфигурация на стороне клиента будет сохранена в XML-файле. На стороне сервера большинство вещей будет жить в SQL-сервере.
Я понимаю, что это до известной степени будет делом вкуса, но я также полагаю, что должно быть возможно добраться до некоторой лучшей практики, где я могу спать ночью, не волнуясь о клиенте <-> коммуникация сервера и пользователи, угоняющие учетные записи и т.д.
Какие-либо хорошие идеи?
Спасибо!
У вас есть две отдельные проблемы: аутентификация зарегистрированного пользователя и создание новой учетной записи.
Это простая часть. У вас есть несколько вариантов:
Таким образом, остаются реальные варианты: дайджест, взаимный 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 с такими поставщиками, как Google или Yahoo, и OAuth с такими поставщиками, как Facebook или Twitter. Это феноменально хорошо работает с веб-приложениями (сам StackOverflow использует такую схему, как вы могли заметить, см. OpenID, One Year Later ). Существуют библиотеки и поставщики интеграции, которые действительно упрощают эту задачу, как 3 щелчка мышью и одна строка кода, например JanRain .
Единственная проблема с OpenID и OpenAuth заключается в том, что это интерактивная схема. Он работает только в том случае, если пользователь активно участвует в процессе входа в систему / аутентификации и, таким образом, устраняет все автоматизированные решения.Если ваше приложение выполняет какие-либо фоновые операции (например, работает в качестве службы) или использует идентификатор приложения для «домашнего телефона» без участия пользователя, тогда OpenID / OAuth не работает.
Я думаю, что это ответит только на «шифрование» вашего вопроса, но я только что прочитал сегодня утром отличную статью о шифровании в Silverlight и .NET, которые могут использоваться для защиты конфиденциальной информации:
Вот часть содержания статьи:
Первым шагом, конечно же, является поиск достаточно надежного протокола шифрования, который может быть реализованным как в Silverlight, так и в .NET, и быть полностью совместимым между обоими временами выполнения. Я собираюсь использовать шифрование AES. AES расшифровывается как «Advanced Encryption Standard». Этот стандарт широко используется и одобрен правительством США и органами по стандартизации.
На такой широкий вопрос нет простого ответа. Существует множество различных видов угроз, с которыми может столкнуться ваше приложение - обычно требуется моделирование угроз , состоящее из:
Прежде чем вы сможете принять решение о том, использовать ли SSL, HTTPS, шифрование или любую другую технологию, вам необходимо понять, какие угрозы каждая из них снижает и как они могут быть скомпрометированы.
Несмотря на то, что существуют передовые методы обеспечения безопасности, вы не можете просто следовать рецепту, чтобы защитить систему.
Хотя в целом вы упоминаете некоторые разумные контрмеры для защиты приложения (хеширование паролей, HTTPS), дьявол кроется в деталях. Иногда вам приходится рассматривать такие сценарии, как:
Есть много других векторов атак (и возможных контрмер), которые следует учитывать.Сколько усилий вы затрачиваете, зависит от важности защищаемого ресурса, последствий его взлома, а также вашего уровня навыков и понимания среды безопасности, в которой вы будете работать.
Microsoft опубликовала документ, называемый Security Жизненный цикл разработки (SDL) , который вы, возможно, захотите изучить. Также на MSDN есть целый раздел Security Engineering , в котором есть много справочной информации и рекомендаций по этой теме.