security - online - AES256 CBC+HMAC SHA256 asegurando la confidencialidad*y*autenticación?
https www freeformatter com hmac generator html (3)
Básicamente, estás recreando SSL / TLS . Esto implica las advertencias habituales sobre la creación de su propio protocolo, y se recomienda encarecidamente utilizar TLS con una biblioteca existente en lugar de reescribir la suya propia.
Dicho esto, utilizar AES con CBC para el cifrado y HMAC para la integridad es sonido. Existen modos de encriptación + integridad combinados (que usted conoce), y CBC + HMAC es una especie de "vieja escuela", pero no puede doler. Usted está haciendo las cosas de la manera "aprobada por la ciencia": encripte, luego MAC la cadena encriptada (y no olvide la IV: olvidar el IV es el error clásico).
Su derivación de clave puede ser algo débil. Es perfecto si SHA-256 se comporta como un oráculo aleatorio perfecto, pero se sabe que SHA-256 no se comporta como un oráculo aleatorio (debido al denominado ataque de extensión de longitud). Es similar a la razón por la que HMAC es HMAC, con dos invocaciones de funciones hash anidadas, en lugar de una simple mezcla (una vez) la concatenación de la clave MAC y los datos. TLS utiliza una función de derivación de clave específica (que se denomina "PRF" en la especificación TLS) que debería evitar cualquier problema. Esa función está construida sobre SHA-256 (en realidad, sobre HMAC / SHA-256) y se puede implementar en cualquier implementación típica de SHA-256.
(No digo que sepa cómo atacar el proceso de derivación de claves, solo que esto es algo difícil de realizar correctamente, y que su seguridad solo puede evaluarse después de años de escrutinio por parte de cientos de criptógrafos. Por eso, reutilizar funciones y protocolos que ya han sido examinados a fondo es básicamente una buena idea.)
En TLS hay dos nonces, llamados "cliente aleatorio" y "servidor aleatorio". En su propuesta, solo tiene el "cliente al azar". Lo que pierde aquí, en cuanto a seguridad, es algo confuso. Una estrategia prudente sería incluir un servidor aleatorio (es decir, otro elemento elegido por Bob). El tipo de cosas que queremos evitar es cuando Alice y Bob ejecutan el protocolo en ambas direcciones, y un atacante alimenta los mensajes de Alice a la propia Alice. El análisis completo de lo que un atacante podría hacer es complejo (es una rama completa de la criptografía); en general, nonces en ambas direcciones tienden a evitar algunos problemas.
Si envía varios paquetes, entonces puede tener algunos problemas sobre paquetes perdidos, paquetes duplicados ("ataques de repetición") y paquetes que están fuera de servicio. En el contexto de TLS, esto no debería ocurrir "normalmente" porque TLS se utiliza en un medio que ya garantiza (en condiciones normales, sin contar los ataques activos) que los datos se transfieren en estricto orden. Por lo tanto, TLS incluye un número de secuencia en los datos que entran en el MAC. Esto detectaría cualquier alteración de un atacante, incluir la repetición, la pérdida de registros y el registro de la reordenación. Si es posible, también debe usar un número de secuencia.
Estoy pensando en usar AES256 CBC + HMAC SHA-256 como un elemento básico para mensajes que garanticen la confidencialidad y la autenticación.
En particular, considere este escenario:
- Alice posee una clave pública perteneciente a Bob (el intercambio de claves y el algoritmo están fuera del alcance de esta pregunta). Alice tiene una clave de identificación K, también compartida con Bob, con la que puede identificarse. Solo Alice y Bob conocen la clave K.
- Alice encripta (nonce || K) usando la clave pública de Bob.
- Bob descifra el paquete y ahora tiene K y nonce.
- Bob usa SHA-256 con SHA256 (K || nonce) para producir una K (e) de 256 bits.
- Bob usa SHA-256 con SHA256 (K || nonce + 1) para producir K (s) de 256 bits.
Ahora, por cada paquete que Bob desea enviar a Alice, realiza lo siguiente:
- Crear un nuevo IV aleatorio de 128 bits
- Encripta el mensaje usando IV y K (e) como la clave.
- Crea un SHA-256 HMAC con K (s) como clave y (IV || Cifrado de mensaje) como datos.
- Finalmente envía (IV || HMAC || Ciphertext) a Alice
Alice también ha calculado K (e) y K (s), y sigue el siguiente procedimiento cuando recibe datos de Bob:
- Divida el mensaje en IV, texto cifrado y HMAC.
- Calcule el HMAC usando K (s), IV y texto cifrado.
- Compare HMAC con el HMAC enviado. Si esto coincide, Alicia considera que este mensaje se autenticó como un mensaje enviado por Bob; de lo contrario, se descarta.
- Alice descifra el mensaje usando K (e)
¿Este protocolo asegura que Alice solo descifra mensajes de Bob, suponiendo que nadie más que Bob puede leer el mensaje cifrado que Alice le envía encriptado usando su clave pública?
Es decir, ¿los mensajes construidos de esta manera aseguran la confidencialidad y la autenticación?
Nota: Si el protocolo requiere que Bob envíe múltiples mensajes, este esquema necesita una ligera modificación para evitar los ataques de repetición.
PD. Soy consciente de AES-GCM / CCM, pero este esquema funcionaría con los algoritmos básicos AES, SHA y HMAC que se encuentran en la mayoría de los paquetes criptográficos. Esta solución también puede ser más lenta, pero eso también está fuera del alcance de la pregunta.
La respuesta a la pregunta es negativa, no hay garantía de que Alice solo descifre los mensajes de Bob, pero eso solo se debe a que no estipuló que solo Bob conoce a K. Si Alice y Bob son las únicas dos personas que conocen K , entonces el quid de la cuestión es si el protocolo de generación de tu clave es el sonido. (Podemos ignorar el resto, creo, porque solo está usando HMAC-SHA256 y AES256 ya que están destinados a ser utilizados).
El protocolo de generación no está mal, pero se puede mejorar. La forma aceptada de crear claves a partir de secretos compartidos es usar una " función de derivación de clave ". Estas funciones utilizan un hash de forma similar a lo que ha hecho aquí, pero también son deliberadamente lentos para inhibir los ataques de fuerza bruta. PBKDF2 parece ser lo que quieres, ya que a) puede derivar 512 bits de datos clave (o más), yb) puede estar compuesto por las primitivas que tienes disponibles; es decir, SHA256 y HMAC-SHA256.
Si no quiere usar PKI, eche un vistazo a TLS-PSK. Parecería resolver el problema exacto que te estás resolviendo. Ver RFC 4279 (y 5487 para cifrados adicionales).