Crittografia autenticata con dati associati (AEAD)

La primitiva AEAD (Authenticated Encryption with Associated Data) è la più comune per la crittografia dei dati ed è adatta alla maggior parte delle esigenze.

AEAD ha le seguenti proprietà:

  • Secrecy: non si conosce nulla del testo non crittografato, tranne la sua lunghezza.
  • Autenticità: è impossibile modificare il testo non crittografato sottostante il testo crittografato senza che ciò venga rilevato.
  • Simmetrica: la crittografia del testo normale e la decrittografia del testo criptato vengono eseguite con la stessa chiave.
  • Randomizzazione: la crittografia è randomizzata. Due messaggi con lo stesso testo non crittografato producono testi crittografati diversi. Gli aggressori non possono sapere quale testo cifrato corrisponde a un determinato testo non crittografato. Se vuoi evitare questo problema, utilizza AEAD deterministico.

Dati associati

AEAD può essere utilizzato per collegare il testo cifrato a dati associati specifici. Supponiamo di avere un database con i campi user-id e encrypted-medical-history. In questo scenario, user-id può essere utilizzato come dati associati durante la crittografia di encrypted-medical-history. In questo modo, un malintenzionato non può trasferire la storia clinica da un utente a un altro.

I dati associati sono facoltativi. Se specificata, la decrittografia ha esito positivo solo se gli stessi dati associati vengono passati alle chiamate di crittografia e decrittografia.

Scegli un tipo di chiave

Sebbene consigliamo AES128_GCM per la maggior parte degli utilizzi, esistono vari tipi di chiavi per diverse esigenze. AES128 offre una sicurezza a 128 bit, mentre AES256 offre una sicurezza a 256 bit.

I due vincoli di sicurezza più importanti da considerare quando si sceglie una modalità sono:

  1. QPS: quanti messaggi vengono criptati con la stessa chiave?
  2. Dimensioni del messaggio: quanto sono grandi i messaggi?

In generale:

  • AES-CTR-HMAC (AES128_CTR_HMAC_SHA256, AES256_CTR_HMAC_SHA256) con un vettore di inizializzazione (IV) di 16 byte è la modalità più conservativa con limiti buoni.
  • AES-EAX (AES128_EAX, AES256_EAX) è leggermente meno conservativo e leggermente più veloce di AES128_CTR_HMAC_SHA256.
  • AES-GCM (AES128_GCM, AES256_GCM) è in genere la modalità più veloce con i limiti più rigorosi al numero di messaggi e alle dimensioni dei messaggi. Quando questi limiti di lunghezza del testo non crittografato e dei dati associati (di seguito) vengono superati, AES-GCM ha esito negativo e il materiale della chiave viene divulgato.
  • AES-GCM-SIV (AES128_GCM_SIV, AES256_GCM_SIV) è quasi veloce quanto AES-GCM. Ha gli stessi limiti di AES-GCM per quanto riguarda il numero di messaggi e le dimensioni dei messaggi, ma quando questi limiti vengono superati, l'errore si verifica in modo meno catastrofico: potrebbe trapelare solo il fatto che due messaggi sono uguali. Ciò lo rende più sicuro da usare rispetto ad AES-GCM, ma è meno utilizzato nella pratica. Per utilizzare questo in Java, devi installare Conscrypt.
  • XChaCha20-Poly1305 (XCHACHA20_POLY1305) ha un limite molto più elevato per il numero di messaggi e le dimensioni dei messaggi rispetto ad AES-GCM, ma quando si verifica un errore (molto improbabile), vengono divulgate anche le informazioni sulle chiavi. Non è accelerato dall'hardware, quindi può essere più lento delle modalità AES nelle situazioni in cui l'accelerazione hardware è disponibile.

Garanzie di sicurezza

Le implementazioni AEAD offrono:

  • Sicurezza CCA2.
  • Efficacia dell'autenticazione di almeno 80 bit.
  • La possibilità di criptare almeno 232 messaggi con un totale di 250 byte. Nessun attacco con un massimo di 232 testi non crittografati o testi crittografati scelti ha una probabilità di successo superiore a 2-32.

Esempi di casi d'uso

Voglio criptare i dati e associare il testo criptato al suo contesto.