La primitiva AEAD in streaming fornisce crittografia autenticata per i dati in streaming. È utile quando i dati da criptare sono troppo grandi per essere elaborati in un singolo passaggio. I casi d'uso tipici includono la crittografia di file di grandi dimensioni o stream di dati in tempo reale.
La crittografia viene eseguita in segmenti, che sono legati alla loro posizione all'interno di un testo cifrato e non possono essere rimossi o riordinati. I segmenti di un testo cifrato non possono essere inseriti in un altro testo cifrato. Per modificare un testo cifrato esistente, l'intero stream di dati deve essere criptato di nuovo.1
La decrittografia è rapida perché viene decriptata e autenticata solo una parte del testo cifrato alla volta. I testi non criptati parziali sono ottenibili senza elaborare l'intero testo criptato.
Le implementazioni AEAD in streaming soddisfano la definizione AEAD e sono sicure nOAE. Hanno le seguenti proprietà:
- Secrecy: non è nota alcuna informazione sul testo non cifrato, tranne la sua lunghezza.
- Authenticity: è impossibile modificare il testo normale criptato sottostante il testo cifrato senza che ciò venga rilevato.
- Symmetric: 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.
Dati associati
La primitiva AEAD in streaming può essere utilizzata 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ò spostare la storia clinica da un utente all'altro.
Scegli un tipo di chiave
Per la maggior parte degli utilizzi, consigliamo AES128_GCM_HKDF_1MB. In generale:
- AES-GCM-HKDF
- AES128_GCM_HKDF_1MB (o AES256_GCM_HKDF_1MB) è l'opzione più veloce. Può criptare 264 file con un massimo di 264 byte ciascuno. Durante il processo di crittografia e decrittografia viene utilizzato circa 1 MB di memoria.
- AES128_GCM_HKDF_4KB consuma circa 4 KB di memoria ed è una buona scelta se il tuo sistema non ha molta memoria.
- AES-CTR HMAC
- AES128_CTR_HMAC_SHA256_1MB (o AES256_CTR_HMAC_SHA256_1MB) è un'opzione più conservativa.
Garanzie di sicurezza
Le implementazioni AEAD in streaming offrono:
- Sicurezza CCA2.
- Efficacia dell'autenticazione di almeno 80 bit.
- La possibilità di criptare almeno 264 messaggi3 per un totale di 251 byte2 . Nessun attacco con fino a 232 codici in chiaro o cifrati scelti ha una probabilità di successo superiore a 2-32.
Esempio di caso d'uso
Consulta Voglio criptare file di grandi dimensioni o stream di dati.
-
Un motivo di questa limitazione è l'utilizzo della crittografia AES-GCM. La crittografia di un segmento di testo non cifrato diverso nella stessa posizione equivarrebbe al riutilizzo dell'IV, che viola le garanzie di sicurezza di AES-GCM. Un altro motivo è che in questo modo vengono evitati gli attacchi di roll-back, in cui l'aggressore potrebbe tentare di ripristinare una versione precedente del file senza essere rilevato. ↩
-
Sono supportati 2 segmenti 32, ciascuno contenente
segment_size - tag_size
byte di testo normale. Per i segmenti di 1 MB, la dimensione totale del testo non cifrato è 232 * (220-16) ~= 251 byte. ↩ -
La crittografia AEAD in streaming diventa non sicura quando viene ripetuta una combinazione di una chiave derivata (128 bit) e un prefisso nonce (valore casuale indipendente di 7 byte). Abbiamo una resistenza alle collisioni di 184 bit, che si traduce approssimativamente in 264 messaggi se vogliamo che la probabilità di successo sia inferiore a 2-32. ↩