He escrito una pieza de software que encripta simétricamente archivos grandes (multi-megabyte). El texto simple se cifra, después del cifrado, el HMAC se calcula y se escribe en el encabezado del archivo. Durante el cifrado, actualizo HMAC continuamente, utilizando como fragmentos de entrada de datos cifrados (cifrar y luego MAC). No hay sumas de comprobación en cada fragmento, por lo que la única posibilidad de verificar si el archivo cifrado fue comprometido es leer el archivo cifrado completo, calcular el HMAC de todo el archivo y compararlo con el valor almacenado en el encabezado del archivo cifrado.
Mi pregunta: sobre el descifrado, ¿es mejor autenticar primero los datos cifrados y luego intentar descifrarlos o continuar con el descifrado y al final comparar HMAC del encabezado del archivo con el HMAC real del cifrado? datos?
Aquí están mis consideraciones:
1. El cálculo de HMAC antes del descifrado me parece, a primera vista, más "seguro". Por otro lado, primero tengo que leer el archivo completo, calcular y comparar HMAC, y luego leer el archivo completo UNA VEZ MÁS - esta vez para descifrar texto sin formato. Esto disminuye el rendimiento, especialmente si el archivo de entrada es grande, pero no almacenamos texto sin cifrar descifrado posiblemente comprometido en el disco (o en cualquier otro lugar), por lo que si el texto en claro está comprometido, el usuario general no puede acceder a TODO.
2. La otra opción es descifrar el archivo inmediatamente, escribir la salida descifrada en el disco, después de procesar el archivo completo, calcular HMAC: si no es igual al valor HMAC del encabezado del archivo, devuelva error "archivo dañado" y elimine la salida descifrada del disco (ya que consideramos que no es válido). Este mecanismo aumenta la velocidad general del proceso de descifrado, ya que leemos el archivo de entrada solo una vez. Por otro lado, si el archivo de entrada está comprometido, hemos escrito datos descifrados innecesarios en el disco, ya que, dado que la comparación HMAC falló, deberían borrarse (y serán) eliminados después de la verificación HMAC.
¿La escritura de datos descifrados de un archivo cifrado potencialmente manipulado compromete la seguridad? ¿Cómo ayudaría a un atacante? Como suponemos que el atacante sabe todo, excepto la contraseña, podría descifrar el archivo comprometido como se describe en la opción 2. Pero no puedo decir si esto lo ayudaría de alguna manera.
De lo contrario, suponemos que las contraseñas seguras y muy largas generadas aleatoriamente se utilizan para el cifrado, el cifrado utilizado también es seguro, la autenticación de la contraseña se realiza a través de KDF (PBKDF2, scrypt, lo que sea), por lo que, tal como se describe anteriormente, mi única la preocupación es cómo realizar la autenticación correctamente.
EDITAR: Por favor, responde NO como "primero debes cifrar, luego HMAC". La pregunta NO es sobre esto. Siempre cifro, luego HMAC. La pregunta es: ¿debo HMAC, luego descifrar o viceversa?
Gracias por su atención.