Bueno, GCM es un modo autenticado que cumple el mismo objetivo, al igual que CCM (Contador con CBC-MAC), y cualquiera de estos sería preferible a una implementación casera. Pero si por alguna razón no tiene acceso a una biblioteca integrada de primitivas que puede usar estos modos (los algoritmos de .NET System.Security.Cryptography, por ejemplo, no tienen estos, pero hay una variedad de opciones de posventa disponibles) ), una combinación de HMAC y un modo no autenticado puede proporcionar una autenticación de mensaje similar.
El problema es que generalmente es mejor cifrar, luego calcular un HMAC del texto cifrado, y anteponer el MAC (que es de longitud fija y por lo tanto puede separarse fácilmente cuando se coloca primero) al texto cifrado. Esto se conoce como el enfoque "Encrypt-then-Authenticate", y es una forma generalmente aceptada de crear un modo de encriptación autenticado a partir de uno no autenticado.
Otras permutaciones como "Autenticar y luego cifrar" (calcular el HMAC del texto sin formato y luego cifrar el HMAC y el texto sin formato en el texto cifrado; este es el enfoque básico de SSL / TLS) o "Autenticar y Encriptar "(calcular el HMAC del texto simple, luego cifrar el texto simple y anteponer el HMAC al texto cifrado) se muestra que es más vulnerable en el caso general. Ciertas implementaciones pueden seguir siendo seguras (AtE es seguro cuando se usa el modo CBC o un cifrado de flujo, si los ataques de relleno y temporización se tienen en cuenta en CBC).
El método EtA es el más seguro en general, cuando se implementa correctamente, por lo que se recomienda para situaciones en las que un desarrollador debe implementar su propio modo autenticado. Funcionará con cualquier modo de cifrado y cifrado seguro, y cualquier algoritmo de MAC seguro. Sin embargo , se debe tener cuidado. En primer lugar, el HMAC debe incluir más que el texto cifrado; También debe incluir el IV y, en situaciones que requieran "flexibilidad de algoritmo", un identificador único de la permutación de los primitivos criptográficos utilizados (como AES128-CBC-HMAC-SHA256). Esto evita que un atacante pueda realizar ciertas explotaciones con un IV o algoritmo diferente.
Otra cosa a tener en cuenta es la posibilidad de un "ataque de tiempo". EtA tiene un modo de fallo inicial muy rápido (el MAC no coincide con el texto cifrado), pero si el MAC coincide, el siguiente posible fallo (un error de relleno) tardará más en descubrirse. Un atacante puede usar la diferencia en el tiempo de cálculo entre un error de MAC y un error de relleno para determinar cuál es cuál, incluso si no proporciona este nivel de detalle en sus comentarios a un cliente. Luego pueden usar esto para realizar un ataque de texto cifrado elegido. Es una preocupación relativamente menor, ya que este esquema hace que las posibilidades de que incluso un cambio diseñado de forma inteligente siga pasando el HMAC extremadamente a un nivel bajo, pero para mitigar esta posibilidad, considere generar algún tipo de retraso que garantice que la cantidad de tiempo necesaria para devolver un error depende de algo distinto al tiempo de cálculo sin procesar.