Использование DPAPI / ProtectedData в среде веб-фермы с хранилищем пользователей

Мне было интересно, успешно ли кто-нибудь использовал DPAPI с пользовательским магазином в среде веб-фермы?

Поскольку наше приложение недавно преобразовано из приложения ASP.NET 1.1 в версию 2.0, мы используем настраиваемую оболочку, которая напрямую вызывает методы CryptUnprotect. Но это должно быть то же самое, что и метод ProtectedData, доступный во фреймворке 2.0.

Поскольку мы работаем в среде веб-фермы, мы не можем гарантировать, что машина, выполнившая шифрование, будет ее расшифровывать. (Также потому, что сбои машины не должны уничтожать наши зашифрованные данные).

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

Проблема в том, что информация, зашифрованная на одном компьютере, не может быть расшифрована на другом, это не удается с ошибкой win32:

'Key not valid for use in specified state'.

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

Если это проблема, как другие используют DPAPI с хранилищем пользователей в среде веб-фермы?

Привет, ты получил на это ответ? У меня та же проблема.

user6535 18.05.2009 16:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
1
3 602
4

Ответы 4

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

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

надеюсь, это поможет!

Плакат Microsoft ошибочен. http://support.microsoft.com/default.aspx?scid=kb;en-us;309408#6

"Для правильной работы DPAPI при использовании перемещаемых профилей пользователь домена должен войти в систему только на одном компьютере в домене. Если пользователь хочет войти в систему на другом компьютере, который находится в домене, пользователь должен выйти из системы. первый компьютер до того, как пользователь войдет на второй компьютер. Если пользователь вошел в систему на нескольких компьютерах одновременно, вполне вероятно, что DPAPI не сможет правильно расшифровать существующие зашифрованные данные ».

Похоже, что DPAPI не будет работать в условиях фермы. Я думаю, что это довольно серьезная оплошность со стороны Microsoft, которая делает DPAPI практически бесполезным для большинства корпоративных приложений.

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

Вы должны «установить» ключ на каждый сервер как часть процесса развертывания. Сценарий установки должен запускаться под идентификатором AppPool и может хранить зашифрованный ключ либо в файле app.config, либо в реестре.

Сами зашифрованные данные могут храниться в центральном репозитории / базе данных, так что к ним могут получить доступ все серверы фермы. Чтобы расшифровать данные, веб-приложение извлекает зашифрованный ключ из того места, где оно было установлено, использует DPAPI для его расшифровки, а затем использует результат для расшифровки данных, поступающих из центрального репозитория.

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

Это немного устарело, но я считаю, что вы все равно сможете «увидеть» ключ, даже если он содержится в web.config и зашифрован с помощью aspnet_regiis. Ваш подход - это то, что ищет большинство людей, поскольку в ASP.NET или BCL нет стандартного аналогичного механизма.

CodeMonkeyKing 21.01.2013 22:41

Это прискорбно, потому что одним из преимуществ DPAPI является то, что он автоматически истекает срок действия главного ключа каждые 3 месяца, но при этом может расшифровать ранее зашифрованные данные. msdn.microsoft.com/en-us/library/ms995355.aspx Цитата: «Это истечение срока не позволяет злоумышленнику скомпрометировать единственный MasterKey и получить доступ ко всем защищенным данным пользователя». Используя свой собственный ключ, если он скомпрометирован, все ваши данные будут раскрыты.

ToddK 12.08.2015 20:26

Двенадцать лет спустя. . . вы можете попробовать использовать СПГ DPAPI, который должен был работать в облачных средах, которые могут быть или не могут быть сбалансированы по нагрузке. По этой ссылке (если она будет удалена):

Microsoft introduced the data protection application programming interface (DPAPI) in Windows 2000. The API consists of two functions, CryptProtectData and CryptUnprotectData. DPAPI is part of CryptoAPI and was intended for developers who knew very little about using cryptography. The two functions could be used to encrypt and decrypt static data on a single computer.

Cloud computing, however, often requires that content encrypted on one computer be decrypted on another. Therefore, beginning with Windows 8, Microsoft extended the idea of using a relatively straightforward API to encompass cloud scenarios. This new API, called DPAPI-NG, enables you to securely share secrets (keys, passwords, key material) and messages by protecting them to a set of principals that can be used to unprotect them on different computers after proper authentication and authorization.

В .NET Core это выглядит как

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG();
}

Другие вопросы по теме