Bene, GCM è una modalità autenticata che raggiunge lo stesso obiettivo, come CCM (Counter with CBC-MAC), e l'una o l'altra sarebbe preferibile a un'implementazione home-brew. Ma se per qualsiasi motivo non si ha accesso a una libreria di primitive incorporata che può utilizzare queste modalità (gli algoritmi di System.Security.Cryptography di .NET, ad esempio, non hanno questi, ma sono disponibili varie opzioni di aftermarket ), una combinazione di HMAC e una modalità non autenticata può fornire un'autenticazione del messaggio simile.
In breve, è generalmente meglio crittografare, quindi calcolare un HMAC del testo cifrato e anteporre il MAC (che è di lunghezza fissa e quindi può essere facilmente separato quando posizionato per primo) nel testo cifrato. Questo è noto come approccio "Encrypt-then-Authenticate" ed è un metodo generalmente accettato per creare una modalità di crittografia autenticata da una non autenticata.
Altre permutazioni come "Authenticate-then-Encrypt" (calcola l'HMAC del testo in chiaro e quindi crittografa l'HMAC e il testo in chiaro in ciphertext, questo è l'approccio di base di SSL / TLS) o "Autentica e Encrypt "(calcola l'HMAC del testo in chiaro, quindi crittografa il testo in chiaro e antepone l'HMAC al testo cifrato) si mostra più vulnerabile nel caso generale. Alcune implementazioni potrebbero essere ancora protette (AtE è sicuro quando si utilizza la modalità CBC o un codice di streaming, se gli attacchi di riempimento e temporizzazione vengono conteggiati in CBC).
Il metodo EtA è il più sicuro in assoluto, se correttamente implementato, e quindi consigliato per le situazioni in cui uno sviluppatore deve implementare la propria modalità autenticata. Funzionerà con qualsiasi modalità di crittografia e crittografia sicura e qualsiasi algoritmo MAC sicuro. Tuttavia , è necessario prestare attenzione. Prima di tutto, l'HMAC deve includere più del testo cifrato; dovrebbe anche includere l'IV e, in situazioni che richiedono "flessibilità algoritmica", un identificatore univoco della permutazione dei primitivi crittografici utilizzati (come AES128-CBC-HMAC-SHA256). Ciò impedisce a un utente malintenzionato di eseguire determinati exploit con un IV o un algoritmo diverso.
Un'altra cosa da tenere a mente è la possibilità di un "attacco a tempo". EtA ha una modalità di errore iniziale molto veloce (il MAC non corrisponde al testo cifrato), ma se il MAC dovesse corrispondere, il successivo errore possibile (un errore di riempimento) richiederà più tempo per essere rilevato. Un utente malintenzionato può utilizzare la differenza nel tempo di calcolo tra un errore MAC e un errore di riempimento per capire quale è, anche se non si fornisce questo livello di dettaglio nel feedback a un client. Possono quindi usarlo per eseguire un attacco di testo cifrato scelto. È una preoccupazione relativamente minore, perché questo schema rende le possibilità che persino un cambiamento ingegnosamente ingegnerizzato passi ancora l'HMAC estremamente basso, ma per mitigare questa possibilità, considera la possibilità di costruire in una sorta di ritardo tale da garantire che la quantità di tempo necessaria per restituire un errore dipende da qualcosa di diverso dal tempo di calcolo non elaborato.