¿Cómo transfiero el HMAC?

4

Tengo un archivo que me gustaría cifrar con una clave simétrica usando AES-256 y luego usar un HMAC para la integridad. Así que no "hago mi propio" esquema, el cual sé que es un gran error, ¿cuáles son los estándares para usar el HMAC una vez que lo haya creado? ¿Es esto para lo que es GCM? ¿Puedo simplemente almacenar el HMAC con las claves o debería incluirlo en el archivo cifrado de alguna manera, ya sea antes de adjuntarlo o adjuntarlo al mensaje final? He visto mucho sobre cómo crear el HMAC y los datos para calcularlo, pero nada sobre qué hacer una vez que lo tenga. Tal vez solo estoy buscando en el lugar equivocado o haciendo las cosas demasiado complicadas.

    
pregunta jeffaudio 06.03.2013 - 17:42
fuente

3 respuestas

5

Combinar el MAC y el cifrado es difícil . Dependiendo de cómo lo hagas, el resultado será seguro, o no, o solo "en su mayoría seguro", un millón de detalles de implementación. GCM es un autenticado Modo de encriptación , que realiza todo el trabajo por usted, por lo que se recomienda encarecidamente que utilice GCM (o un modo equivalente como EAX ) en lugar de diseñar su propio protocolo.

Solo para fines de investigación , el valor de MAC será parte de los datos cifrados si usa MAC-then-encrypt, mientras que tendrá que transmitirse o almacenarse por separado si usa encrypt-then -MAC o cifrado y MAC. Después esto es solo una cuestión de codificación. "Encrypt-then-MAC" se recomienda especialmente porque como MAC opera sobre los datos de cifrado , no puede revelar nada sobre los datos de texto sin formato, por lo que el valor de MAC se puede mostrar a todos sin ningún efecto negativo.

    
respondido por el Thomas Pornin 06.03.2013 - 18:37
fuente
2

Bueno, GCM es un modo autenticado que cumple el mismo objetivo, al igual que CCM (Contador con CBC-MAC), y cualquiera de estos sería preferible a una implementación casera. Pero si por alguna razón no tiene acceso a una biblioteca integrada de primitivas que puede usar estos modos (los algoritmos de .NET System.Security.Cryptography, por ejemplo, no tienen estos, pero hay una variedad de opciones de posventa disponibles) ), una combinación de HMAC y un modo no autenticado puede proporcionar una autenticación de mensaje similar.

El problema es que generalmente es mejor cifrar, luego calcular un HMAC del texto cifrado, y anteponer el MAC (que es de longitud fija y por lo tanto puede separarse fácilmente cuando se coloca primero) al texto cifrado. Esto se conoce como el enfoque "Encrypt-then-Authenticate", y es una forma generalmente aceptada de crear un modo de encriptación autenticado a partir de uno no autenticado.

Otras permutaciones como "Autenticar y luego cifrar" (calcular el HMAC del texto sin formato y luego cifrar el HMAC y el texto sin formato en el texto cifrado; este es el enfoque básico de SSL / TLS) o "Autenticar y Encriptar "(calcular el HMAC del texto simple, luego cifrar el texto simple y anteponer el HMAC al texto cifrado) se muestra que es más vulnerable en el caso general. Ciertas implementaciones pueden seguir siendo seguras (AtE es seguro cuando se usa el modo CBC o un cifrado de flujo, si los ataques de relleno y temporización se tienen en cuenta en CBC).

El método EtA es el más seguro en general, cuando se implementa correctamente, por lo que se recomienda para situaciones en las que un desarrollador debe implementar su propio modo autenticado. Funcionará con cualquier modo de cifrado y cifrado seguro, y cualquier algoritmo de MAC seguro. Sin embargo , se debe tener cuidado. En primer lugar, el HMAC debe incluir más que el texto cifrado; También debe incluir el IV y, en situaciones que requieran "flexibilidad de algoritmo", un identificador único de la permutación de los primitivos criptográficos utilizados (como AES128-CBC-HMAC-SHA256). Esto evita que un atacante pueda realizar ciertas explotaciones con un IV o algoritmo diferente.

Otra cosa a tener en cuenta es la posibilidad de un "ataque de tiempo". EtA tiene un modo de fallo inicial muy rápido (el MAC no coincide con el texto cifrado), pero si el MAC coincide, el siguiente posible fallo (un error de relleno) tardará más en descubrirse. Un atacante puede usar la diferencia en el tiempo de cálculo entre un error de MAC y un error de relleno para determinar cuál es cuál, incluso si no proporciona este nivel de detalle en sus comentarios a un cliente. Luego pueden usar esto para realizar un ataque de texto cifrado elegido. Es una preocupación relativamente menor, ya que este esquema hace que las posibilidades de que incluso un cambio diseñado de forma inteligente siga pasando el HMAC extremadamente a un nivel bajo, pero para mitigar esta posibilidad, considere generar algún tipo de retraso que garantice que la cantidad de tiempo necesaria para devolver un error depende de algo distinto al tiempo de cálculo sin procesar.

    
respondido por el KeithS 06.03.2013 - 18:14
fuente
1

Para extender la respuesta de Thomas Pornin, también se recomienda el cifrado-entonces-mac, ya que primero toma el mac del texto cifrado y lo compara con el mac que envió el remitente. Solo va a realizar la tarea de descifrado con uso intensivo del procesador si los dos MAC son iguales y se demuestra que los datos no están atenuados. Si los dos MAC no son iguales, no hay ningún punto en el descifrado del paquete ya que ya se ha comprobado que los datos no son auténticos. Si ejecuta mac-then-encrypt, primero debe realizar el descifrado y luego tomar el mac del mensaje y compararlo con el mac original. Moxie Marlinspike llama a esto The Cryptographic Doom Principle

    
respondido por el void_in 06.03.2013 - 19:23
fuente

Lea otras preguntas en las etiquetas