Мне было интересно, успешно ли кто-нибудь использовал DPAPI с пользовательским магазином в среде веб-фермы?
Поскольку наше приложение недавно преобразовано из приложения ASP.NET 1.1 в версию 2.0, мы используем настраиваемую оболочку, которая напрямую вызывает методы CryptUnprotect. Но это должно быть то же самое, что и метод ProtectedData, доступный во фреймворке 2.0.
Поскольку мы работаем в среде веб-фермы, мы не можем гарантировать, что машина, выполнившая шифрование, будет ее расшифровывать. (Также потому, что сбои машины не должны уничтожать наши зашифрованные данные).
Итак, у нас есть обслуживаемый компонент, который запускается в службе под определенной учетной записью пользователя на каждом из наших веб-боксов. У этого пользователя настроен перемещаемый профиль в соответствии с рекомендациями.
Проблема в том, что информация, зашифрованная на одном компьютере, не может быть расшифрована на другом, это не удается с ошибкой win32:
'Key not valid for use in specified state'.
Я подозреваю, что это связано с тем, что я допустил ошибку, запустив службу шифрования от имени пользователя на нескольких машинах, и, следовательно, удерживал пользователя в системе более чем на одной машине одновременно.
Если это проблема, как другие используют DPAPI с хранилищем пользователей в среде веб-фермы?





Я только что это видел. Есть способ выполнить эту работу, а именно убедиться, что машины в ферме находятся в домене, и использовать учетную запись домена для шифрования и дешифрования данных (т. Е. Запустить приложение под учетной записью домена).
Вы не можете использовать 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 нет стандартного аналогичного механизма.
Это прискорбно, потому что одним из преимуществ DPAPI является то, что он автоматически истекает срок действия главного ключа каждые 3 месяца, но при этом может расшифровать ранее зашифрованные данные. msdn.microsoft.com/en-us/library/ms995355.aspx Цитата: «Это истечение срока не позволяет злоумышленнику скомпрометировать единственный MasterKey и получить доступ ко всем защищенным данным пользователя». Используя свой собственный ключ, если он скомпрометирован, все ваши данные будут раскрыты.
Двенадцать лет спустя. . . вы можете попробовать использовать СПГ 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();
}
Привет, ты получил на это ответ? У меня та же проблема.