...
El usuario solicita la ejecución de una acción protegida desde el dispositivo. Internamente el dispositivo lee la clave criptográfica almacenada durante el proceso de enrolamiento y genera un TOTP utilizando la hora actual. Posteriormente envía el TOTP junto con el cuerpo de la solicitud de validación.
Los servicios de backend reciben la petición y la redirigen al servicio de agregación.
El servicio de agregación retransmite la petición el servicio de Token
El servicio de token ofusca el identificador de cuenta de usuario y lo usa como clave de acceso de registro para leer de la base de datos.
El servicio de token recupera la clave cifrada de la base de datos
El servicio de Token envía el TOTP generado por el cliente junto con la clave cifrada a HSM adapter.
HSM adapter envía la clave cifrada a AWS ClodHSM para su descifrado.
AWS CloudHSM descifra la clave y la retorna a HSM Adapter.
HSM adapter genera un nuevo TOTP con la clave cifrada.
Se compara el TOTP generado con el TOTP generado por el dispositivo. Si se encuentran en la misma ventana de tiempo el valor debe ser igual y la autenticación es exitosa.
El resultado es retornado al servicio de Token
El servicio de Token retransmite el resultado al servicio de agregación
El servicio de agregación reenvía respuesta a servicios de backend, los cuales, en el caso de Spin, de ser exitosa generan un nuevo token para ser añadido en la cabecera que la transacción a autorizar desde el dispositivo.
El dispositivo recibe la respuesta de la autenticación y en el caso de Spin, añaden e token a el encabezado de la solicitud de transacción.
Implementación del algoritmos
Generación de claves asimétricas desde el dispositivo
Con el fin de garantizar que solamente el dispositivo y el servicio de generación de TOTP conozcan la clave criptográfica, desde el dispositivo se debe generar un par de claves asimétricas. La implementación que se realizó en javascript para probar la solución fue la siguiente:
...
Como se mencionó anteriormente la validación de la funcionalidad se hizo usando RSA. Es posible utilizar otros algoritmos, sin embargo deben satisfacer la implementación anterior, y en algunos casos puede ser necesario especificar la codificación, lo que implicaría añadir un nuevo parámetro al servicio HSM adapter.
Generación de TOTP
Para generar el TOTP desde el dispositivo se desarrolló la siguiente implementación:
...
Se define un tamaño de TOTP de 9 dígitos
Se obtiene el timestamp actual en intervalos de 30 segundos.
Se formatea la hora en hexadecimal, mayúscula y con un padding de 16 ceros
Se convierte la hora y la cláveme criptográfica a su buffer de bytes equivalente
Se genera un HMAC con el buffer de la clave criptografica y se actualiza con el buffer de la hora.
Se genera el hash de HMAC.
Se extraen 4 bytes de el buffer del HASH, se convierten a su equivalente a entero de 32 bits, se redondea a 9 dígitos y se añade un padding a la izquierda en caso que el valor sea menor a 9 bytes.
Recomendaciones de uso
Pruebas locales
Para la ejecución de las pruebas locales probablemente el Servicio de AWS CloudHSM no esté disponible, por esta razón se sugiere deshabilitar la anotación @PostConstruct que se encuentra en el la clase com.oxxo.fintech.ffss.hsm.adapter.service.core.config.HSMConfig
De ésta forma las operaciones de cifrado se harán sobre un componente local y funcionarán de forma análoga a CloudHSM