Confidencialidad e integridad para la sesión web

3

Cuando el cliente se autentica con nuestro servicio, se le emite un "token" opaco. Este token incluye la información que identifica al cliente y otra información sobre el cliente ("carga útil"). El servicio utiliza la carga útil cuando el cliente devuelve el token al servicio en solicitudes posteriores. La carga útil no debe ser revelada al cliente, por lo que no solo se debe mantener la integridad, sino también la confidencialidad.

Esto es lo que iba a usar para generar este token:  - HMAC-SHA256 para la integridad.  - AES en modo CBC por confidencialidad

Entonces, dada la carga útil P , las teclas K1 y K2 para generar el "token" I

  • rellena P a un múltiplo de 16
  • generar IV de longitud 16
  • cifre P usando AES con K1 y IV
  • concatenar IV y P encriptado
  • obtenga un resumen del resultado (IV + P encriptado) utilizando HMAC-SHA256 con K2 como clave
  • concatenar el resumen con el resultado

Dado que la IV y la digestión son de longitud conocida, no se necesitan separadores. El relleno probablemente se hará con espacios, ya que el formato utilizado para la carga útil no da importancia a los espacios finales.

Debo decir que no me gusta mucho la seguridad, por lo que podría faltar algunas cosas muy obvias. De todos modos, las preguntas:

  • Hacer esto se parece mucho a "rodar mi propio cripto". ¿Estoy reinventando la rueda aquí?
  • ¿Hay alguna seguridad adicional en el uso de K1 y K2 separados, dado que se se almacenarán "lado a lado"? Si no es así, sin duda será más conveniente para mí utilizar la misma clave
  • ... bueno, ¿me perdí algo?
pregunta shylent 20.02.2013 - 09:03
fuente

2 respuestas

5

Bueno, estás reinventando la rueda, pero al menos estás usando una forma circular para eso, lo cual es mejor que lo que hacen la mayoría de los inventores de ruedas. Y, francamente, hay un poco de escasez de ruedas de alta calidad de uso inmediato.

Usas CBC con un IV (que debe generarse con un fuerte PRNG ), y eso es bueno. Usted aplica HMAC en los datos de encriptados y eso es bueno . No olvide incluir el IV en la entrada de HMAC, que habría sido el error clásico de cifrar y luego MAC. Y estás usando claves distintas para el cifrado y el MAC, lo cual es bueno. Así que, realmente, no está mal en absoluto.

Es posible que desee considerar los siguientes puntos:

  • En su formato, no hay ninguna indicación de qué algoritmos se utilizan, por lo que no hay algoritmo de agilidad : si mañana desea cambiar a otro algoritmo de cifrado, no puede hacerlo sin rompiendo la compatibilidad con las cargas útiles existentes (a menos que juegues con la longitud total). Para agilidad de algoritmo limpio, es posible que desee agregar un encabezado: un solo byte con un valor convencional, por ejemplo. siempre 0x01 (las versiones posteriores del formato de carga útil utilizarían otros valores). Nota importante: si lo hace, no olvide agregar también el byte del encabezado en la entrada HMAC.

  • Si tiene dos claves K1 y K2 es inconveniente para usted, es posible que desee almacenar una sola clave K , y derivar teclas K1 y K2 de K . Mientras el proceso de derivación sea unidireccional y uniforme, esto estará bien. Queremos que la clave de cifrado y la clave MAC sean distintas para evitar interacciones desagradables entre los dos algoritmos; no se conocen tales interacciones en el caso de AES-CBC y HMAC / SHA-256, pero es "mejor prevenir que lamentar". En su caso, simplemente pique K con SHA-256, use la primera mitad (128 bits) para K1 , la segunda mitad (128 bits) para K2 .

  • Hay modos cifrado autenticado más nuevos que combinan el cifrado y la verificación de integridad, y hacen todo el trabajo duro por tú. En particular, GCM y EAX se consideran seguros y están libres de patentes. Ofrecen algunas bonificaciones: no es necesario un aleatorio IV (un IV no repetitivo, como un contador es suficiente), no es necesario el relleno (dependen del modo CTR internamente), solo una tecla (cualquiera la "expansión" se maneja internamente).

  • Si un usuario puede obtener varias cargas útiles, entonces puede cambiarlas y reproducir las cargas útiles antiguas. Dependiendo de su contexto, esto puede o no ser un problema para usted.

  • Si las claves no son específicas del usuario, los usuarios en colusión podrían intercambiar cargas útiles. Dependiendo de su contexto, esto puede o no ser un problema para usted.

respondido por el Thomas Pornin 20.02.2013 - 13:29
fuente
2
  

El relleno probablemente se realizará con espacios, ya que el formato utilizado para la carga útil no da importancia a los espacios finales.

Es probable que esté mejor usando un esquema de relleno estándar y luego invente el suyo. Por ejemplo, rellenar a n bytes utilizando n n bytes repetidos de n, o agregar un bloque de relleno ficticio si ya tiene la longitud adecuada.

    
respondido por el Tinned_Tuna 20.02.2013 - 16:20
fuente

Lea otras preguntas en las etiquetas