La documentación de MSDN hace un buen trabajo explicándolo:
Un pequeño inconveniente de usar la contraseña de inicio de sesión es que todas las aplicaciones que se ejecutan bajo el mismo usuario pueden acceder a cualquier información protegida que conozcan. Por supuesto, debido a que las aplicaciones deben almacenar sus propios datos protegidos, obtener acceso a los datos podría ser algo difícil para otras aplicaciones, pero ciertamente no es imposible.
Básicamente, si alguien descubre algunos datos protegidos (por ejemplo, una cadena de conexión cifrada almacenada en el registro), una aplicación simple que se ejecute en el contexto del usuario podría usar de forma trivial DPAPI para descifrar los datos protegidos.
Para contrarrestar esto, DPAPI permite que una aplicación utilice un secreto adicional al proteger datos. Este secreto adicional es necesario para desproteger los datos.
Técnicamente, este "secreto" debería llamarse entropía secundaria. Es secundario porque, si bien no refuerza la clave utilizada para cifrar los datos, aumenta la dificultad de una aplicación, que se ejecuta bajo el mismo usuario, para comprometer la clave de cifrado de otra aplicación. Las aplicaciones deben tener cuidado con la forma en que usan y almacenan esta entropía. Si simplemente se guarda en un archivo sin protección, los adversarios podrían acceder a la entropía y usarla para desproteger los datos de una aplicación.
El almacenamiento claro de la entropía en texto sin formato en la misma ubicación en que los datos protegidos anula completamente el propósito.
El parámetro se explica de la siguiente manera:
Función de protección interna
pOptionalEntropy
Puntero a un DATA_BLOB
que contiene entropía adicional utilizada para proteger los datos. El miembro cbData
tiene la longitud de la cadena de bytes de pbData
member que contiene la entropía opcional. El DATA_BLOB
utilizado en la llamada de protección también debe usarse en la llamada de desprotección. Este es el "secreto" específico de la aplicación mencionado anteriormente.
Este parámetro es opcional y puede ser NULL .
Función interna de desprotección
pOptionalEntropy
Puntero a un DATA_BLOB
que contiene entropía adicional utilizada cuando los datos estaban protegidos. El miembro cbData
tiene la longitud de la cadena de bytes de pbData
member que contiene la entropía opcional. Este es el "secreto" específico de la aplicación mencionado anteriormente.
Este parámetro es opcional y puede ser NULL . Sin embargo, si se usó la entropía opcional en la llamada de protección, esa misma entropía debe usarse en la llamada de desprotección.
Por lo tanto, podría aumentar la protección contra otras aplicaciones (o incluso contra el usuario) utilizando el parámetro de entropía y dificultando un poco descubrir el valor de la entropía.
Entonces, ¿está bien almacenar la entropía como texto sin formato (tal vez código duro)?
El texto sin formato probablemente esté bien, siempre que la ubicación sea difícil de encontrar o acceder. Ponerlo en la misma ubicación que los datos protegidos no tiene sentido.
No podrá obtener "seguridad perfecta" contra un ataque que ya tenga acceso de usuario y tiempo y recursos suficientes. Pero hay algunas cosas pequeñas que puedes hacer para frenarlos:
- Si codifica el valor de entropía en la aplicación, puede encontrarlo en el binario. Pero esto es más difícil de hacer.
- Si aplica una transformación simple (como XOR) al valor de entropía antes de usarla, su aplicación debería ser descompilada o el código fuente comprometido para que un atacante sepa qué hacer.
- Puede almacenar su valor de entropía de forma remota. Esto significa que un atacante necesitaría saber dónde encontrarlo. Y necesita otras credenciales apropiadas para acceder a ella. (Por supuesto, dichas otras credenciales también deberían ser accesibles para la aplicación, por lo que no es posible "seguridad perfecta" en este escenario).