Estoy trabajando en extender una aplicación web con una API basada en HTTP RESTful. Decidimos requerir que el cliente proporcione un token de autenticación en cada solicitud (en lugar de usar sesiones u otros esquemas de autenticación de varios pasos como OAuth). Por ejemplo:
POST /foo HTTP/1.1
Authorization: Bearer <authentication token>
...
El token es una cadena opaca de caracteres para el usuario. El token solo se muestra al usuario una vez. Un solo usuario puede generar múltiples tokens y asociar diferentes permisos y un nombre descriptivo a cada uno. Cada solicitud a la API se registra en un registro visible para el usuario y cada entrada de registro está asociada con el token específico que se utilizó para la solicitud.
En nuestra implementación actual, almacenamos una entidad con los siguientes atributos en la base de datos:
- UUID aleatorio (clave principal, utilizada para hacer referencia al token de las entradas del registro)
- Token de autenticación (indexado)
- Cuenta de usuario asociada y permisos
- Descripción suministrada por el usuario
- Revocado (booleano)
Discutimos diferentes implicaciones de seguridad de este enfoque. Una amenaza, que me gustaría discutir aquí es:
¿Qué sucede si un atacante obtiene temporalmente acceso de lectura a la base de datos?
Claramente, almacenar los tokens de autenticación los hace vulnerables. Después de leer la base de datos, un atacante puede usar cualquiera de los tokens no revocados para acceder a la API. Pensamos en proteger los tokens almacenados en la base de datos de dicha amenaza.
¿Qué enfoques (y posiblemente, algoritmos o protocolos aplicables) pueden usarse para proteger los tokens de autenticación en tal escenario?
Estaba pensando en cambiar el token y usar el resultado para encontrar la entrada correcta en la base de datos.