En el trabajo, estoy tratando de diseñar un sistema de autenticación de usuario sin sesión (incluidos los tokens basados en sesión, como los que se utilizan en OAuth2) debido a los requisitos del software del cliente. Los servicios son REST y estamos intentando diseñar un sistema de autenticación que pueda usar encabezados HTTP para comunicar los datos de autenticación al servidor.
He utilizado la autorización de firma de solicitudes de Amazon EC2 [1] anteriormente y la encontré bien adaptada a nuestros requisitos, excepto en nuestro caso, trataremos con usuarios individuales (que tendrán una contraseña) en lugar de scripts programados / automáticos Sistemas utilizados para conectar a EC2. El sistema que he creado funciona exactamente igual que EC2, con una diferencia: en lugar de que el cliente del usuario almacene una clave de API privada (la clave de acceso de AWS descrita en los documentos de EC2), almacenarán una contraseña (por ejecución de software) que luego se procesará como está en el servidor y se usará para firmar la solicitud.
Para resumir cómo funcionarán las solicitudes:
- El usuario ingresa la contraseña en el software cliente
- Contraseña de hashes (whirlpool) unidireccional del software
- El software crea un resumen (HMAC) de la solicitud con la contraseña de hash
- El software hace que el servicio web sea una llamada al servidor, firmándolo con el resumen
- Repita el paso 4 hasta que salga el software
En el servidor:
- El servidor recibe la solicitud, recupera la contraseña con hash de la tabla de usuarios
- El servidor crea el resumen de la solicitud con una contraseña con hash y verifica que coincida
- Si se verifica, el usuario se autentica y se realiza la solicitud
También consideraremos las solicitudes de restricción de por vida para evitar ataques repetidos contra el servidor y preservar la identidad del servicio, y usar HTTPS siempre que sea posible para proporcionar una capa de seguridad adicional (sin embargo, esto no siempre es posible debido a las restricciones de software).
¿Este sistema es seguro?
[1] enlace