DPAPI: использование CryptUnprotect до входа пользователя в систему

Я использую DPAPI для хранения данных XML. Данные после CryptProtectData хранятся в файле. В одном из моих вариантов использования эти данные должны быть дешифрованы до того, как любой пользователь войдет на рабочую станцию. Поскольку я не могу использовать пользовательский ключ в этом, я устанавливаю флаг "CRYPTPROTECT_LOCAL_MACHINE" во время шифрования. Энтропийный ключ - это статический текст.

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

Я перечитываю всю документацию DPAPI, чтобы узнать, как генерируются ключи. Но, к сожалению, информации об этом конкретном флаге недостаточно.

Будет ли CryptUnprotectData работать в этом сценарии вообще? Может ли это быть вызвано приложениями, которые выполняются под некоторым сеансом пользователя? Любая помощь приветствуется.

Спасибо, D

Ответ 1

Мы используем DPAPI для хранения пароля, требуемого службой:

  • Зашифровать с помощью CRYPTPROTECT_LOCAL_MACHINE | CRYPTPROTECT_UI_FORBIDDEN.

  • Расшифровать с помощью CRYPTPROTECT_UI_FORBIDDEN

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

Ответ 2

Документация Microsoft действительно расплывчата в этом вопросе. Passcape сделал очень хорошую рецензию под названием DPAPI Secrets.

Соответствующий раздел для вашего вопроса Восстановление паролей беспроводного подключения в Windows 7, в котором подробно описаны данные, необходимые для дешифрования:

  • "Главный ключ системы из папки E:/Windows/System32/Microsoft/Protect/S-1-5-18/User"
  • Два файла реестра: "SYSTEM" и "SECURITY"

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