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?