Criptografia autenticada de streaming com dados associados (Streaming AEAD)

O primitivo AEAD de streaming fornece criptografia autenticada para dados de streaming. Ela é ú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 criptografia de arquivos grandes ou streams de dados ao vivo.

A criptografia é feita em segmentos, que são vinculados à sua localização dentro de um texto criptografado e não podem ser removidos ou reordenados. Os segmentos de um texto criptografado não podem ser inseridos em outro. Para modificar um texto criptografado existente, todo o fluxo de dados precisa ser criptografado novamente.1

A descriptografia é rápida porque apenas uma parte do texto criptografado é descriptografada e autenticada de cada vez. É possível acessar textos simples parciais sem processar todo o texto criptografado.

As implementações de AEAD de streaming atendem à definição AEAD e são seguras pela OAE2. Eles têm as seguintes propriedades:

  • Confidencialidade: nada é conhecido sobre o texto simples, exceto o tamanho dele.
  • Autenticidade: é impossível mudar o texto simples criptografado que está por trás do texto criptografado sem ser detectado.
  • Simetria: 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 sabem qual texto criptografado corresponde a um determinado texto simples.

Dados associados

A AEAD de streaming pode ser usada para vincular 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 evita que um invasor transfira o histórico médico de um usuário para outro.

Escolha um tipo de chave

Recomendamos AES128_GCM_HKDF_1MB para a maioria dos usos. De modo geral:

  • AES128_GCM_HKDF_1MB (ou AES256_GCM_HKDF_1MB) é a opção mais rápida. Ele pode criptografar 264 arquivos com até 264 bytes cada. Cerca de 1 MB de memória é consumido durante o processo de criptografia e descriptografia.
  • O AES128_GCM_HKDF_4KB consome cerca de 4 KB de memória e é uma boa opção caso seu sistema não tenha muita memória.
  • AES128_CTR_HMAC_SHA256_1MB (ou AES256_CTR_HMAC_SHA256_1MB) é uma opção mais conservadora.

Garantias de segurança

As implementações de streaming AEAD oferecem:

  • Segurança CCA2.
  • Força de autenticação de pelo menos 80 bits.
  • Capacidade de criptografar pelo menos 264 mensagens3 com um total de 251 bytes2 . Nenhum ataque com até 232 textos simples ou criptografados escolhidos tem probabilidade de sucesso maior do que 2 a 32.

Exemplo de caso de uso

Consulte Quero criptografar arquivos grandes ou fluxos de dados.


  1. Um motivo 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 detecção. 

  2. São aceitos 232 segmentos, cada um contendo segment_size - tag_size bytes de texto simples. Para segmentos de 1 MB, o tamanho total do texto simples é de 232 * (220-16) ~= 251 bytes.

  3. O streaming AEAD se torna inseguro quando uma combinação de chave derivada (128 bits) e prefixo de uso único (valor de valor de uso único aleatório independente) é repetida. Temos resistência a colisão de 184 bits, o que significa aproximadamente 264 mensagens para que a probabilidade de sucesso seja menor que 2 a 32