El cifrado NO protege automáticamente los datos contra modificaciones.
Por ejemplo, digamos que tenemos un cifrado de flujo que es simplemente un PRNG (generador de números aleatorios), donde la clave es la semilla. El cifrado funciona generando números aleatorios en secuencia (la secuencia de teclas) y excluyéndolos con el texto sin formato. Si un atacante conoce algunos bytes de texto simple y texto cifrado en un punto en particular, puede juntarlos para recuperar el flujo de claves de esos bytes. A partir de ahí, puede simplemente seleccionar algunos bytes de texto sin formato nuevos y xor ellos con la secuencia de teclas.
A menudo, el atacante no necesita saber el texto en claro para lograr algo. Tomemos un ejemplo en el que un atacante simplemente necesita corromper un campo en particular en los datos internos de un paquete. Él no sabe cuál es su valor, pero no lo necesita. Simplemente reemplazando esos bytes de texto cifrado con números aleatorios, ha cambiado el texto simple.
Esto es particularmente interesante en los cifrados de bloque donde se usa el relleno, ya que nos abre a ataques de oráculo de relleno . Estos ataques implican ajustar el texto cifrado de una manera que altera la cadena de relleno y observa el resultado. Otros ataques como BEAST y el Lucky Thirteen Attack involucra la modificación del texto cifrado de una manera similar. Estos tienden a depender del hecho de que algunas implementaciones descifran datos a ciegas antes de realizar cualquier tipo de verificación de integridad.
Además, puede ser posible reenviar un paquete cifrado, lo que podría causar algún comportamiento en el cliente o servidor. Un ejemplo de esto podría ser un comando para alternar el estado habilitado del firewall. Esto se denomina ataque de reproducción, y el cifrado por sí solo no lo protegerá. De hecho, las comprobaciones de integridad a menudo tampoco solucionan este problema.
De hecho, hay tres propiedades primarias que son deseables en un esquema de comunicaciones seguras:
-
Confidencialidad : la capacidad de evitar que los intrusos descubran el mensaje de texto sin formato, o información sobre el mensaje de texto sin formato (por ejemplo, el peso de Hamming).
-
Integridad : la capacidad de evitar que un atacante activo modifique el mensaje sin que los usuarios legítimos lo noten. Por lo general, esto se proporciona a través de un Código de integridad del mensaje (MIC).
-
Autenticidad : la capacidad de demostrar que un mensaje fue generado por una parte en particular y evitar la falsificación de mensajes nuevos. Esto generalmente se proporciona a través de un Código de autenticación de mensaje (MAC). Tenga en cuenta que la autenticidad implica automáticamente integridad.
El hecho de que el MAC y el MIC puedan ser proporcionados por un único esquema HMAC apropiadamente elegido (a veces llamado MAIC) en ciertas circunstancias es completamente incidental. La diferencia semántica entre integridad y autenticidad es real, ya que puede tener integridad sin autenticidad, y tal sistema aún puede presentar problemas.
La distinción real entre integridad y autenticidad es difícil de definir, como me dijo Thomas Pornin en el chat:
Hay un punto de definición difícil allí. La integridad es que se obtienen los "datos correctos", pero de acuerdo con la noción de "derecho"? ¿Cómo es que los datos del atacante no son "correctos"? Si responde "porque es del atacante, no del cliente correcto", entonces está haciendo la autenticación ...
Es un poco de un área gris, pero de cualquier manera todos podemos estar de acuerdo en que la autenticación es importante.
Una alternativa a usar un MAC / MIC separado es usar un modo de cifrado de bloque autenticado, como Modo Gallois / Counter ( GCM) o modo EAX .