Verificar el inicio de sesión y el cifrado con PBKDF2

10

Estoy escribiendo una aplicación de escritorio en la que estoy usando PBKDF2 para generar una clave de cifrado para cifrar AES-128 el archivo de configuración. El archivo de configuración contiene una clave crypo-aleatoria que se ha utilizado para cifrar los datos del programa. El usuario ya ingresó esa clave tal como la proporcionamos en la instalación. La idea es que ingresen la clave criptográfica aleatoria una vez y luego puedan usar una contraseña más fácil de recordar. Hasta ahora todo bien.

Entonces, cuando el usuario carga el programa, ingresa la contraseña. Usamos la contraseña para regenerar la clave PBKDF2 y descifrar el archivo de configuración.

Ahora, ¿cómo verifico fácilmente que el usuario ingresó la contraseña correcta? Por supuesto, si ingresaron una contraseña incorrecta, el descifrado de los datos no funcionará. Pero me gustaría rechazar la contraseña inmediatamente en lugar de dejar que el programa se cargue y luego el usuario recibe un cuadro de mensaje de error de descifrado.

He leído que TrueCrypt cifra una constante conocida, la cadena "VERDADERO" y luego verifica que la clave basada en contraseña cifrará "VERDADERO" en el mismo texto cifrado. También he leído acerca de cómo generar un hash HMAC-SHA para verificar los datos cifrados. Pero no desea utilizar la misma clave para el MAC y para cifrar los datos. Por esta razón, me gusta el método de TrueCrypt (no tengo que rastrear dos conjuntos de sales e IV). Realmente no me importa si un atacante puede cargar el programa. No podrán leer ningún dato. Simplemente no quiero que el usuario ingrese la contraseña incorrecta y creo que el programa es inseguro.

¿Cuál es la forma correcta de hacer esto?

    
pregunta John 05.07.2012 - 16:58
fuente

2 respuestas

11

Depende de si desea defenderse contra errores tipográficos o ataques.

Si solo quiere defenderse contra errores de escritura , simplemente incluya algo de estructura en su archivo de configuración. Por ejemplo, defina que su archivo de configuración DEBE comenzar, cuando se descifre, con la cadena "Este es el archivo de configuración para la aplicación FooBar". Si no encuentra esa cadena al descifrarla, entonces la clave es incorrecta.

Si desea defenderse de attacks (un malvado altera voluntariamente partes del archivo de configuración cifrado para que cargue una clave incorrecta), entonces necesita algo más sólido. . La solución "correcta" es utilizar un modo de cifrado autenticado (mi favorito es EAX ). Si su marco de programación no incluye una implementación del modo EAX, puede hacer algo como esto:

  • A partir de la frase de contraseña del usuario, genere 384 bits de clave (PBKDF2 es una "función de derivación de clave", se puede usar para producir claves de longitud arbitraria). Divídalos en tres claves de 128 bits K1 , K2 y < em> K 3 .
  • Cifre el archivo de configuración con AES-128-CBC, usando K1 como clave y K2 como IV. Llame al resultado C (el archivo cifrado).
  • Calcule un valor de MAC sobre C , usando la tecla K3 . Para la función MAC, use HMAC con SHA-256 (o SHA-1, pero se prefiere SHA-256 una base general). El MAC se almacena a lo largo de C (añadido, como encabezado, como un archivo separado ... es su elección).
  • Al descifrar, al revés: obtenga las tres claves de PBKDF2, verifique el MAC y (solo si el MAC fue correcto) descifre el archivo.

Este esquema resistiría tanto los ataques como los errores de escritura (sin embargo, no distingue entre una contraseña incorrecta y un ataque genuino).

Editar: Lo había dejado implícito, pero sería mejor decirlo claramente: ya que estamos usando PBKDF2, hay un salt que se usa para activar la contraseña en la salida PBKDF2. Cada archivo encriptado DEBE tener su propia sal. La sal DEBE estar codificada en el encabezado del archivo. Si un archivo se "vuelve a cifrar", se DEBE generar una nueva sal aleatoria.

    
respondido por el Thomas Pornin 03.09.2012 - 20:10
fuente
1

El mecanismo de TrueCrypt es probablemente la mejor opción aquí. Puede verificar si la contraseña era correcta después de descifrar un solo bloque y no requiere consideraciones de seguridad adicionales.

La introducción de hash y verificación adicionales lo deja vulnerable a cualquier debilidad en esos algoritmos. En este caso, confía únicamente en la seguridad de su cifrado, en el que también confía para proteger sus datos. ¡Si AES-128 está dañado, tener la "PRUEBA" identificada incorrectamente como válida es la menor de tus preocupaciones!

    
respondido por el Polynomial 05.07.2012 - 17:55
fuente

Lea otras preguntas en las etiquetas