En nuestra aplicación web, hacemos un buen uso de los tokens de un solo uso. Por ejemplo, cuando alguien crea cualquiera de las tres "cuentas", restablece su contraseña o cualquier otra cantidad de cosas que requieren tokens aleatorios de un solo uso, nosotros:
- Genera 32 bytes aleatorios desde el CSPRNG del SO
- La URL base-64 lo codifica
- Almacene el hash en nuestra base de datos (Scrypt con N = 2 ^ 15, r = 8, P = 1)
- Proporcione al usuario el token de uso único (generalmente en forma de una URL)
Todo esto funciona bien. Sin embargo, a través de los perfiles, hemos notado que algunas de nuestras llamadas a la API pueden demorar un par de segundos porque tienen que verificar y crear tokens. Algunas llamadas a la API usarán Scrypt tres o más veces.
Si bien no es terrible, nos gustaría acelerar las llamadas a la API si es posible.
He planteado la idea de generar previamente algunos tokens aleatorios, pero me gustaría una segunda opinión antes de ir a la cabeza y comenzar con esto.
Hay dos maneras en las que creo que podríamos abordar esto. Primero, simplemente crearíamos (token, hash, salt) triples y almacenaríamos en memoria. El aspecto negativo de esto es que tendríamos los tokens sin cifrar simplemente sentados allí, y un atacante podría obtenerlos y usarlos. Sin embargo, eso requeriría acceso a la instancia específica de AWS y los tokens de un solo uso serían la menor de nuestras preocupaciones en esa situación.
El segundo sería utilizar una bóveda de algún tipo, por lo que las tuplas todavía están en la memoria, pero están cifradas. Esto suena más seguro, pero aún requiere que la contraseña de la bóveda esté en algún lugar, por lo que el atacante aún tendría acceso si tuviera acceso a la instancia de AWS.
¿Pensamientos? Estoy un poco preocupado por esta idea, pero realmente me gustaría reducir algunas llamadas de API de tres segundos a menos de un segundo.