A primitiva AEAD de streaming oferece criptografia autenticada para dados de streaming. É útil quando os dados a serem criptografados são muito grandes para serem processados em uma única etapa. Os casos de uso típicos incluem a criptografia de arquivos grandes ou transmissões de dados ao vivo.
A criptografia é feita em segmentos, que são vinculados ao local em um texto criptografado e não podem ser removidos nem reorganizados. Os segmentos de um texto criptografado não podem ser inseridos em outro texto criptografado. Para modificar um texto criptografado, todo o fluxo de dados precisa ser criptografado novamente.1
A descriptografia é rápida porque apenas uma parte do texto criptografado é descriptografada e autenticada por vez. Textos simples parciais podem ser obtidos sem processar todo o texto criptografado.
As implementações de AEAD em streaming atendem à definição de AEAD e são seguras contra ataques de OEA (nOAE). Eles têm as seguintes propriedades:
- Secrecy: nada sobre o texto simples é conhecido, exceto o tamanho dele.
- Authenticity: é impossível mudar o texto simples que foi criptografado sem ser detectado.
- Symmetric: a criptografia do texto simples e a descriptografia do texto criptografado são feitas com a mesma chave.
- Ordem aleatória: a criptografia é aleatória. Duas mensagens com o mesmo texto simples geram textos criptografados diferentes. Os invasores não podem saber qual texto criptografado corresponde a um determinado texto simples.
Dados associados
A primitiva AEAD de streaming pode ser usada para vincular o texto criptografado a dados
associados específicos. Suponha que você tenha um banco de dados com os
campos user-id
e encrypted-medical-history
. Nesse cenário, user-id
pode ser usado como dados associados ao criptografar encrypted-medical-history
. Isso
impede que um invasor mova o histórico médico de um usuário para outro.
Escolher um tipo de chave
Recomendamos AES128_GCM_HKDF_1MB para a maioria dos usos. De modo geral:
- AES-GCM-HKDF
- AES128_GCM_HKDF_1MB (ou AES256_GCM_HKDF_1MB) é a opção mais rápida. Ele pode codificar 264 arquivos com até 264 bytes cada. Cerca de 1 MB de memória é consumido durante o processo de criptografia e descriptografia.
- AES128_GCM_HKDF_4KB consome cerca de 4 KB de memória e é uma boa escolha se o sistema não tiver muita memória.
- AES-CTR HMAC
- AES128_CTR_HMAC_SHA256_1MB (ou AES256_CTR_HMAC_SHA256_1MB) é uma opção mais conservadora.
Garantias de segurança
As implementações de AEAD em streaming oferecem:
- Segurança CCA2.
- Força de autenticação de pelo menos 80 bits.
- A capacidade de criptografar pelo menos 264 mensagens3 com um total de 251 bytes2 . Nenhum ataque com até 232 textos simples ou textos cifrados escolhidos tem uma probabilidade de sucesso maior que 2-32.
Exemplo de caso de uso:
Consulte Quero criptografar arquivos grandes ou fluxos de dados.
-
Uma razão para essa restrição é o uso da cifra AES-GCM. Criptografar um segmento de texto simples diferente no mesmo local seria equivalente a reutilizar o IV, o que viola as garantias de segurança do AES-GCM. Outra razão é que isso evita ataques de reversão, em que o invasor pode tentar restaurar uma versão anterior do arquivo sem ser detectado. ↩
-
Há suporte para 232 segmentos, com cada segmento contendo
segment_size - tag_size
bytes de texto simples. Para segmentos de 1 MB, o tamanho total de texto simples é 232 * (220-16) ~= 251 bytes. ↩ -
O streaming AEAD se torna inseguro quando uma combinação de chave derivada (128 bits) e prefixo de valor de uso único (valor aleatório independente de 7 bytes) é repetida. Temos uma resistência a colisões de 184 bits, o que equivale a 264 mensagens se quisermos que a probabilidade de sucesso seja menor que 2-32. ↩