¿Cuál es el propósito del parámetro de entropía para DPAPI.Protect?

10

En Windows, cuando realiza una llamada a la API de protección de datos, puede especificar algunos bytes como "entropía".

Para mí, esto suena como sal. En PBKDF2, la sal es lata y, de hecho, debe almacenarse como texto sin formato. No compromete la seguridad del algoritmo, es parte de su implementación.

¿La "entropía" que usted pasa a la DPAPI cumple la misma función? He leído que todo lo que hace es hacer que su clave sea específica de la aplicación, hasta el punto de que si el usuario que inició sesión leyó las claves almacenadas con DPAPI, no podría descifrar sus datos cifrados sin la entropía. Por supuesto, la entropía debería almacenarse como texto plano (o de lo contrario terminará con una regresión infinita).

Entonces, ¿está bien almacenar la entropía como texto sin formato (tal vez código duro)?

Gracias a dr jimbob:

El parámetro de entropía "es la entropía opcional proporcionada por la aplicación que se agregará a la derivación clave. Por defecto, DPAPI ya usa una entropía diferente para cada blob, por lo que en la práctica, agregar entropía adicional no [negrita agregada] mejora la seguridad del cifrado. Según la documentación, su propósito es permitir que las aplicaciones que confían en DPAPI mitiguen el riesgo de que otra aplicación robe sus secretos. En nuestra prueba, encontramos que solo GTalk usó el La entropía condicional, con su valor, se almacena en una clave de registro y, por lo tanto, no es un obstáculo real para el atacante ".

    
pregunta John 18.09.2012 - 22:33
fuente

2 respuestas

3

Desde la navegación: enlace

La entropía proporciona un vector de inicialización de 16 bytes, no una sal criptográfica.

Por lo general, no es necesario que mantenga su IV secreto [1] , solo debe tener cuidado de no para reutilizar el mismo IV (lo cual no sucederá si se generó de forma aleatoria ya que hay 2 128 valores posibles).

El propósito del vector de inicialización es aleatorizar inicialmente su mensaje antes de cifrarlo (generalmente solo el primer bloque).

Compare Electronic CodeBook (ECB) que no necesita una IV y Cipher-Block Chaining que lo necesita.

Digamos que tiene alguna función de cifrado encrypted_block = Encrypt(block, key) que tomará un bloque de datos de tamaño fijo (por ejemplo, 128 bits), una clave de cifrado secreta y devolverá un bloque de datos cifrado, que se puede descifrar con block = Decrypt(encrypted_block, key) . Entonces, si cifra un archivo de 10 KB con un tamaño de bloque de 128 bits, entonces tiene 640 bloques para cifrar. Si dos bloques son idénticos en el original (digamos que es una imagen con poca entropía), entonces los bloques cifrados al final terminarán siendo idénticos y los patrones a menudo se pueden discernir. Así que, básicamente, el BCE simplemente divide un archivo en bloques y aplica la función de cifrado a cada bloque individualmente (sin depender de la salida de los bloques anteriores).

Ahora veamos un esquema como CBC que usa un vector de inicialización (IV). El primer bloque está cifrado por encrypted_block_0 = Encrypt(block_0 ^ IV, key) , donde ^ es el XOR (exclusivo o operador a nivel de bits). El siguiente bloque está cifrado con encrypted_block_1 = Encrypt(block_1 ^ encrypted_block_0, key) ; es decir, utiliza el resultado del cifrado del bloque anterior para "aleatorizar" el bloque actual antes de alimentar su función de cifrado. Ahora, si no usaron un vector de inicialización para el primer bloque, uno podría deducir cosas observando los primeros bloques de pareja. Por ejemplo, si tenía dos archivos encriptados con el mismo vector de inicialización y vio que los primeros 10 bloques eran idénticos, aprendería que los primeros 10 bloques de los archivos de texto sin formato son idénticos y obtendrá información adicional. No es que simplemente saber el IV en el texto simple no te ayude en absoluto, ya que está dentro de una función Encrypt no lineal complicada que no puedes revertir sin conocer el key secreto.

EDITAR: En realidad, creo que me equivoqué al asumir que los 16 bytes se utilizan como vector de inicialización en DPAPI; Aquí hay una ingeniería inversa de la DPAPI secreta de microsoft: enlace

    
respondido por el dr jimbob 18.09.2012 - 22:46
fuente
9

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).
respondido por el Disillusioned 16.05.2014 - 16:37
fuente

Lea otras preguntas en las etiquetas