windows winapi dpapi

windows - DPAPI: Usar CryptUnprotect antes de que el usuario inicie sesión



winapi (2)

Estoy usando DPAPI para almacenar datos XML. Los datos después de CryptProtectData se almacenan en un archivo. En uno de mis casos de uso, esta información debe descifrarse antes de que cualquier usuario inicie sesión en la estación de trabajo. Como no puedo usar una clave específica para el usuario en esto, estoy configurando el indicador "CRYPTPROTECT_LOCAL_MACHINE" mientras cifro. La clave de entropía es un texto estático.

Desproteger funciona en todos los escenarios, excepto cuando lo llamo antes de iniciar sesión (ningún usuario ha iniciado sesión). Su error de retorno 87 (el parámetro es incorrecto).

Releí toda la documentación de DPAPI para ver cómo se generan las claves. Pero, desafortunadamente, no hay suficiente información para esta bandera específica.

¿Funcionará CryptUnprotectData en este escenario? ¿Las aplicaciones que se ejecutan bajo alguna sesión de usuario pueden invocarlo? Cualquier ayuda es apreciada.

Gracias: D


Usamos DPAPI para almacenar una contraseña requerida por un servicio:

  • Encriptar con CRYPTPROTECT_LOCAL_MACHINE | CRYPTPROTECT_UI_FORBIDDEN.

  • Descifrar con CRYPTPROTECT_UI_FORBIDDEN

El servicio se ejecuta cuando la máquina arranca (es decir, antes del inicio de sesión); todo funciona bien


La documentación de Microsoft es vaga en este punto. Passcape ha hecho un muy buen artículo llamado Secretos DPAPI .

La sección relevante para su pregunta es Recuperar contraseñas de conexión inalámbrica en Windows 7 , que describe en detalle los datos necesarios para el descifrado:

  1. La "clave maestra del sistema de la carpeta E:/Windows/System32/Microsoft/Protect/S-1-5-18/User "
  2. Dos archivos de registro: "SISTEMA" y "SEGURIDAD"

Según los nombres, no me sorprendería que estos archivos estén protegidos por el sistema operativo y solo sean accesibles para los usuarios que hayan iniciado sesión, aunque alguien más podría confirmarlo.