Imagine que está ejecutando un servicio que implementa un flujo de OAuth 2.0 para permitir a sus usuarios finales iniciar sesión en aplicaciones de terceros y autorizar a esas aplicaciones a consumir los datos de su servicio a través de algunas API.
Al autenticar con éxito una aplicación de terceros a través de su flujo de OAuth, su servicio envía a la aplicación de terceros un token de portador que autentica (y autoriza) a la aplicación de terceros (en nombre del usuario final) para utilizar la API de su servicio.
Tal token de portador debe almacenarse en sus servidores para poder realizar la autenticación de las llamadas API entrantes. Dado que el token del portador autentica (y autoriza) a los clientes, debe almacenarlo de forma segura, como si almacenara una contraseña.
Sin embargo, mientras que las contraseñas se incluyen con sal y hash antes de guardarlas en el disco, también se consultan por su principal correspondiente (nombre de usuario / dirección de correo electrónico), en lugar de hacerlo por la representación segura de la contraseña.
En el caso de un token de portador, no hay ningún principal que usar para buscar credenciales / tokens coincidentes. Suponiendo que desee almacenar tokens de portador como contraseñas (salado + hash), tendrá que buscar todas las sal posibles, aplicar cada una, luego codificar el token salado y luego verificar si existe en algún lugar de su sistema. Eso no se escala.
Entonces, mi pregunta es: ¿Cómo puede almacenar con seguridad tokens de portador en su servidor? Es decir, sin tener que generar cada representación segura posible cada vez que necesite verificar un token.
Por "almacenar de forma segura los tokens del portador", me refiero a que un atacante que obtenga el archivo de todos los tokens del portador "que estén guardados de forma segura" no podrá usarlos.