Tengo una situación en la que necesito un token que proporciona autenticación. El procedimiento HMAC común que encontré es:
- Obtenga alguna clave con las credenciales de inicio de sesión
- Crear mensaje, agregar clave y otros datos del mensaje (en el orden definido)
- Hash con una clave secreta
- Transmitir mensaje e incluir valores que están en el mensaje (no hash)
entonces
- Recibe el mensaje
- Use los valores sin borrar para reconstruir el mensaje
- Hash con clave secreta
- Si los hashes coinciden, entonces el mensaje es bueno.
Estoy implementando algo similar, pero no creo que deba realizar algunos de estos pasos. Quería saber: ¿Mi implementación tiene agujeros de seguridad en la lógica ?
Mi implementación:
- El cliente le pide al servidor que genere un token, esto requiere credenciales de inicio de sesión.
- El servidor crea un token pero no lo devuelve (se guarda en la base de datos): devuelve una marca de tiempo.
- El cliente genera un mensaje basado en la marca de tiempo, el usuario y otros datos.
- El token de hashes del cliente con una clave secreta, proporcionado fuera de este proceso.
- El cliente envía el token al servidor.
Entonces:
- Recibe el mensaje
- Si ese token está en la base de datos, es válido
Mi razonamiento detrás de la reconstrucción del mensaje es: eso sucedió cuando se generó el token y el cliente no pudo conocer el token en la base de datos a menos que supiera cómo generarlo, lo que significa que se autenticaron y tienen una clave secreta.