Открыть сервис

Data Protection API

Data Protection API (DPAPI) — это криптографический интерфейс прикладного программирования, встроенный в операционные системы семейства Microsoft Windows, начиная с Windows 2000. DPAPI предназначен для симметричного шифрования и дешифрования данных, используя в качестве ключа пароль текущего пользователя (учётной записи) или учётной записи компьютера. Основная функция DPAPI — защита конфиденциальных данных (паролей, ключей, токенов, файлов) от несанкционированного доступа со стороны других пользователей или процессов, работающих в той же системе, без необходимости управления ключами шифрования со стороны разработчика приложения.

История и развитие

DPAPI была впервые представлена в Windows 2000 как часть архитектуры Cryptographic API (CryptoAPI). Изначально она была реализована в виде функции CryptProtectData и CryptUnprotectData. В последующих версиях Windows (Windows XP, Windows Vista, Windows 7, Windows 8, Windows 10 и Windows 11) функциональность DPAPI оставалась в значительной степени обратно совместимой, но претерпела ряд улучшений. В Windows Vista и более поздних версиях была добавлена поддержка дополнительных параметров, таких как указание дополнительных данных (optional entropy) для усложнения атак. В Windows 10 и Windows 11 DPAPI продолжает использоваться, но для новых приложений Microsoft рекомендует использовать более современные API, такие как Key Storage Providers (KSP) и Microsoft Data Protection API (DPAPI-NG), которые предоставляют более гибкие возможности управления ключами и поддерживают асимметричное шифрование.

Принцип работы

DPAPI использует симметричное шифрование (обычно алгоритм AES-256 в режиме CBC) для защиты данных. Ключ шифрования генерируется на основе мастер-ключа, который, в свою очередь, защищён хешем пароля пользователя (или пароля компьютера). Процесс защиты данных включает следующие этапы:

  1. Выбор контекста: Приложение вызывает CryptProtectData с указанием, какие данные следует защитить и для какого контекста — пользовательского (CRYPTPROTECT_LOCAL_MACHINE не указан) или машинного (CRYPTPROTECT_LOCAL_MACHINE указан).
  2. Генерация сессионного ключа: На основе мастер-ключа пользователя (или компьютера) и случайной соли (salt) генерируется сессионный ключ.
  3. Шифрование: Данные шифруются сессионным ключом. К зашифрованным данным добавляется заголовок, содержащий соль, идентификатор мастер-ключа и другую метаинформацию.
  4. Возврат результата: Функция возвращает зашифрованный BLOB (двоичный объект), который может быть сохранён в файле, реестре или передан по сети.

Для дешифрования вызывается CryptUnprotectData, которая извлекает из BLOB метаданные, восстанавливает сессионный ключ (используя пароль текущего пользователя или компьютера) и расшифровывает данные. Если пароль не совпадает или пользователь не имеет прав доступа, дешифрование завершается ошибкой.

Виды и контексты защиты

DPAPI предоставляет два основных контекста защиты, определяющих, какой мастер-ключ используется:

Пользовательская защита (User Protection)

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

Машинная защита (Machine Protection)

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

Дополнительные параметры (Optional Entropy)

DPAPI позволяет передавать дополнительную строку (entropy) при вызове CryptProtectData. Эта строка не хранится в зашифрованном BLOB, а должна быть известна при дешифровании. Использование entropy усложняет атаки, так как злоумышленнику, получившему BLOB, необходимо знать entropy для успешного дешифрования, даже если он имеет доступ к мастер-ключу.

Применение

DPAPI широко используется в экосистеме Windows для защиты конфиденциальных данных, управляемых приложениями и системными компонентами:

  • Браузеры: Internet Explorer, Microsoft Edge (старая версия на EdgeHTML) и некоторые другие браузеры используют DPAPI для шифрования сохранённых паролей, данных автозаполнения и файлов cookie.
  • Управление паролями: Windows Credential Manager (Диспетчер учётных данных) использует DPAPI для защиты сохранённых учётных данных (логинов и паролей) для доступа к сетевым ресурсам, веб-сайтам и приложениям.
  • Шифрование файлов: EFS (Encrypting File System) использует DPAPI для защиты ключей шифрования файлов, которые хранятся в профиле пользователя.
  • Приложения: Многие сторонние приложения, работающие под Windows, используют DPAPI для защиты своих конфиденциальных данных (например, ключей API, токенов аутентификации, лицензионных ключей).
  • Системные службы: Службы Windows, такие как служба резервного копирования (Volume Shadow Copy) и служба обновления, могут использовать DPAPI для защиты своих внутренних данных.

Критика и ограничения

Несмотря на широкое распространение, DPAPI имеет ряд ограничений и уязвимостей, которые делают её не идеальным решением для всех сценариев:

  • Зависимость от пароля: Безопасность DPAPI напрямую зависит от стойкости пароля пользователя. Слабый пароль может быть подобран атакой перебором, что позволит расшифровать данные. В случае машинной защиты ключ хранится в системе, и его извлечение возможно при физическом доступе к машине.
  • Отсутствие ротации ключей: DPAPI не поддерживает автоматическую ротацию мастер-ключей. Если мастер-ключ скомпрометирован, все данные, защищённые с его помощью, становятся уязвимыми.
  • Непригодность для серверных сценариев: DPAPI не предназначена для использования в веб-приложениях или серверных средах, где несколько пользователей могут одновременно работать с данными, а пароли пользователей могут быть недоступны. В таких случаях рекомендуется использовать более специализированные решения, такие как Azure Key Vault или HSM.
  • Уязвимость к атакам на память: Процесс дешифрования может оставлять ключи в памяти процесса, что делает их доступными для атак, таких как снятие дампа памяти.
  • Отсутствие асимметричного шифрования: DPAPI не поддерживает асимметричное шифрование, что ограничивает её применение в сценариях, требующих разделения ключей или подписи данных.

Альтернативы и преемники

Microsoft разработала более современные API, которые постепенно заменяют DPAPI в новых приложениях:

  • DPAPI-NG (Next Generation): Представлена в Windows 8. DPAPI-NG поддерживает как симметричное, так и асимметричное шифрование, а также позволяет защищать данные для группы пользователей или компьютеров, а не только для одного пользователя или машины. Она использует Key Protection Service (KPS) для управления ключами.
  • Key Storage Providers (KSP): Позволяют хранить и использовать криптографические ключи (в том числе асимметричные) в защищённом хранилище, таком как TPM (Trusted Platform Module) или смарт-карта.
  • Azure Key Vault: Облачный сервис Microsoft для безопасного хранения и управления ключами, сертификатами и секретами, используемый в облачных приложениях.

Источники

  • Microsoft Docs: CryptProtectData function (Windows)
  • Microsoft Docs: CryptUnprotectData function (Windows)
  • Microsoft Docs: Data Protection API (DPAPI)
  • Microsoft Docs: DPAPI-NG (Next Generation)
  • Windows Internals, Part 1 (7th Edition) by Pavel Yosifovich, Alex Ionescu, Mark E. Russinovich, David A. Solomon

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →