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 non crittografato e la decrittografia del testo crittografato 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 decriptazione ha esito positivo solo se gli stessi dati associati vengono passati sia alle chiamate di criptaggio che a quelle di decriptaggio.
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 ben definiti.
- 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ù rigorosi al numero di messaggi e alle dimensioni dei messaggi. Quando questi limiti per il testo non criptato e le lunghezze dei dati associati (di seguito) vengono superati, AES128_GCM non funziona e rivela il materiale della chiave.
- AES128_GCM_SIV è quasi veloce quanto AES128_GCM. Ha gli stessi limiti di AES128_GCM per quanto riguarda il numero di messaggi e le dimensioni dei messaggi, ma quando questi limiti vengono superati, l'errore è meno catastrofico: potrebbe trapelare 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 più elevato per il numero di messaggi e le dimensioni dei messaggi rispetto ad AES128_GCM, ma quando non funziona (molto improbabile) perde anche il materiale della chiave. 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 scelti 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.