El tipo primitivo de AEAD de transmisión proporciona encriptación autenticada para la transmisión de datos. Es útil cuando los datos que se van a encriptar son demasiado grandes para procesarse en un solo paso. Entre los casos de uso típicos, se incluye la encriptación de archivos grandes o transmisiones de datos en vivo.
La encriptación se realiza en segmentos, que están vinculados a su ubicación dentro de un texto cifrado y no se pueden quitar ni reordenar. Los segmentos de un texto cifrado no se pueden insertar en otro. Para modificar un texto cifrado existente, se debe volver a encriptar todo el flujo de datos.1
La desencriptación es rápida porque solo se desencripta y autentica una parte del texto cifrado a la vez. Los textos simples parciales se pueden obtener sin procesar todo el texto cifrado.
Las implementaciones de AEAD de transmisión cumplen con la definición de AEAD y son seguras con NOAE. Tienen las siguientes propiedades:
- Secrecy: No se sabe nada sobre el texto simple, excepto su longitud.
- Authenticity: Es imposible cambiar el texto simple encriptado que subyace al texto cifrado sin que se detecte.
- Symmetric: La encriptación del texto simple y la desencriptación del texto cifrado se realizan con la misma clave.
- Aleatorización: La encriptación es aleatoria. Dos mensajes con el mismo texto simple generan textos cifrados diferentes. Los atacantes no pueden saber qué texto cifrado corresponde a un texto simple determinado.
Datos asociados
La primitiva de AEAD de transmisión se puede usar para vincular el texto cifrado a datos asociados específicos. Supongamos que tienes una base de datos con los campos user-id
y encrypted-medical-history
. En este caso, user-id
se puede usar como datos asociados cuando se encripta encrypted-medical-history
. Esto evita que un atacante mueva los antecedentes médicos de un usuario a otro.
Elige un tipo de clave
Recomendamos AES128_GCM_HKDF_1MB para la mayoría de los usos. En general:
- AES-GCM-HKDF
- AES128_GCM_HKDF_1MB (o AES256_GCM_HKDF_1MB) es la opción más rápida. Puede encriptar 264 archivos con hasta 264 bytes cada uno. Se consume aproximadamente 1 MB de memoria durante el proceso de encriptación y desencriptación.
- AES128_GCM_HKDF_4KB consume alrededor de 4 KB de memoria y es una buena opción si tu sistema no tiene mucha memoria.
- HMAC de AES-CTR
- AES128_CTR_HMAC_SHA256_1MB (o AES256_CTR_HMAC_SHA256_1MB) es una opción más conservadora.
Garantías de seguridad
Las implementaciones de AEAD de transmisión ofrecen lo siguiente:
- Seguridad CCA2.
- Tener al menos 80 bits de seguridad de autenticación
- La capacidad de encriptar al menos 264 mensajes3 con un total de 251 bytes2 . Ningún ataque con hasta 232 textos simples o textos cifrados elegidos tiene una probabilidad de éxito mayor que 2-32.
Ejemplo de caso de uso
Consulta Quiero encriptar archivos grandes o flujos de datos.
-
Un motivo de esta restricción es el uso del algoritmo de cifrado AES-GCM. Encriptar un segmento de texto simple diferente en la misma ubicación equivaldría a volver a usar el IV, lo que infringe las garantías de seguridad de AES-GCM. Otra razón es que esto evita los ataques de reversión, en los que el atacante puede intentar restablecer una versión anterior del archivo sin detección. ↩
-
Se admiten 232 segmentos, cada uno de los cuales contiene
segment_size - tag_size
bytes de texto simple. Para segmentos de 1 MB, el tamaño total de texto simple es 232 × (220 - 16) ~= 251 bytes. ↩ -
La transmisión de AEAD se vuelve insegura cuando se repite una combinación de clave derivada (128 bits) y prefijo de nonce (valor aleatorio independiente de 7 bytes). Tenemos una resistencia a las colisiones de 184 bits, lo que se traduce aproximadamente en 264 mensajes si queremos que la probabilidad de éxito sea inferior a 2-32. ↩