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 è noto nulla del testo non cifrato, tranne la sua lunghezza.
  • Autenticità: è impossibile modificare il testo normale criptato sottostante il testo cifrato senza che ciò venga rilevato.
  • Simmetrica: la crittografia del testo in chiaro e la decrittografia del testo cifrato vengono eseguite con la stessa chiave.
  • Randomizzazione: la crittografia è randomizzata. Due messaggi con lo stesso testo in chiaro generano crittogrammi diversi. Gli aggressori non possono sapere quale messaggio cifrato corrisponde a un determinato testo non criptato. Se vuoi evitarlo, utilizza AEAD deterministico.

Dati associati

AEAD può essere utilizzato per legare il testo cifrato a dati associati specifici. Supponi 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 all'altro.

Scegli un tipo di chiave

Sebbene consigliamo AES128_GCM per la maggior parte degli utilizzi, esistono vari tipi di chiavi per esigenze diverse (per la sicurezza a 256 bit, sostituisci AES128 con AES256 di seguito). In generale:

  • AES128_CTR_HMAC_SHA256 con un vettore di inizializzazione (IV) di 16 byte è la modalità più conservativa con limiti adeguati.
  • AES128_EAX è leggermente meno conservativo e leggermente più veloce di AES128_CTR_HMAC_SHA256.
  • AES128_GCM è in genere la modalità più veloce, con i limiti più rigidi sul numero di messaggi e sulle dimensioni dei messaggi. Quando questi limiti relativi alle lunghezze dei dati in testo normale e associati (di seguito) vengono superati, AES128_GCM non riesce e vengono divulgati i materiali delle chiavi.
  • AES128_GCM_SIV è quasi veloce quanto AES128_GCM. Ha gli stessi limiti di AES128_GCM per il numero e le dimensioni dei messaggi, ma quando questi limiti vengono superati, si verifica un errore in modo meno catastrofico: potrebbe essere rivelato solo il fatto che due messaggi sono uguali. Questo lo rende più sicuro da usare rispetto ad AES128_GCM, ma è meno utilizzato nella pratica. Per utilizzarlo in Java, devi installare Conscrypt.
  • XChaCha20Poly1305 ha un limite molto maggiore per il numero di messaggi e le dimensioni dei messaggi rispetto ad AES128_GCM, ma in caso di errore (molto improbabile) consente anche la fuga di materiale chiave. Non è accelerato hardware, quindi può essere più lento rispetto alle modalità AES nelle situazioni in cui è disponibile l'accelerazione hardware.

Garanzie di sicurezza

Le implementazioni AEAD offrono:

  • Sicurezza CCA2.
  • Efficacia dell'autenticazione di almeno 80 bit.
  • La possibilità di criptare almeno 232 messaggi per un totale di 250 byte. Nessun attacco con fino a 232 testi in chiaro o cifre scelte ha una probabilità di successo superiore a 2-32.

Esempi di casi d'uso

Voglio criptare i dati e legare il testo cifrato al suo contesto.