Asegurar los tokens de autenticación almacenados en la base de datos del lado del servidor

0

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.

    
pregunta Feuermurmel 01.11.2016 - 13:01
fuente

1 respuesta

1

Sus tokens son contraseñas, excepto que no permite que los usuarios elijan contraseñas débiles. Creo que deberían ser hash en la db. Debido a que tienen mucha entropía (recomiendo una base64 de 15 bytes leída de /dev/urandom ), puedes usar una sola ronda de SHA-256. Si no cree que 120 bits de entropía es suficiente, use 30 bytes. De todos modos, la GPU no puede comprobar todas las combinaciones.

    
respondido por el Z.T. 01.11.2016 - 14:27
fuente

Lea otras preguntas en las etiquetas