Esta oración se aplica específicamente cuando se usa HMAC en combinación con el cifrado. HMAC se puede usar solo si solo te importa el mensaje autenticidad : garantiza quién produjo el mensaje, pero no oculta el contenido del mensaje. Esta oración no se aplica en este caso. Cuando se usa HMAC solo para autenticidad, el HMAC se calcula sobre el texto sin formato y eso es todo.
Cuando desea tener tanto secreto como autenticidad, es decir, cuando desea ocultar el contenido del mensaje y garantizar su origen, necesita cifrado autenticado . Hay modos de operación que proporcionan cifrado autenticado; GCM, que se menciona en el artículo, es una opción popular y una buena opción.
También es posible improvisar un mecanismo de cifrado autenticado combinando un mecanismo de cifrado (como un cifrado de bloque en modo CTR o CBC) con un mecanismo de autenticación (como HMAC). Sin embargo, hacer esto correctamente es sutil. Hay dos formas principales de hacerlo: cifrar-luego-MAC o MAC-luego-cifrar. La oración que cita dice que debe cifrar y luego MAC, es decir, primero debe cifrar el mensaje y luego autenticar el resultado final (que es el texto cifrado que incluye el IV). Esta es una buena recomendación en principio , pero no es fácil implementarlo correctamente.
La recomendación contra GCM es mala. Sí, falla si la IV se reutiliza. Sin embargo, una biblioteca criptográfica decente llamará al RNG por su cuenta para generar un IV, eliminando el riesgo de reutilización IV (a menos que el RNG del sistema se rompa, en cuyo caso su generación de claves también se rompe). (Existen bibliotecas criptográficas erróneas que requieren que la persona que llama realice todas las tareas de plomería; evítelas). Es mucho más fácil usar una biblioteca GCM correctamente que ensamblar HMAC y el cifrado correctamente. La recomendación poco clara de hacer encriptar y luego HMAC contradice la recomendación # 1 del artículo contra la "sopa criptográfica".
A menos que tenga una buena razón para hacerlo, y entienda perfectamente lo que está haciendo, siempre use las bibliotecas crypto de más alto nivel que hacen lo que necesita . Use una capa de protocolo que dependa de TLS y realice la verificación del certificado, si es posible, use el mecanismo de cifrado de archivos o discos del sistema operativo y el almacenamiento de contraseñas en lugar de la suya, use bibliotecas criptográficas que realizan todas las llamadas de RNG y la generación IV y adjuntándolas internamente si tienes que bajar al nivel de criptografía, etc.