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?