Por lo tanto, he creado un sistema de autenticación. Vertido sobre él para cualquier tipo de fallas de seguridad y probé la mierda fuera de él. Creo que es bastante seguro, pero hay un aspecto de diseño diferente "diferente" que no es habitual en un sistema de autenticación web.
Básicamente, quería que fuera posible realizar la autenticación sin hacer un seguimiento de la sesión de cada usuario. Esto significa menos carga en la base de datos y trivial para escalar y almacenar en caché. Aquí están los "secretos" guardados por el servidor:
- Se mantiene una clave privada en el código fuente de la aplicación
- Se mantiene una sal generada aleatoriamente para cada usuario
Para que no tenga sesión, pero no es fácil falsificar las cookies, este es el formato de mis cookies
expires=expiretimestamp
secret=hash(privatekey + otherinfo + username + hashedpassword + expires)
username=username
(con otherinfo
son cosas como la dirección IP, información del navegador, etc. y con hashedpassword=hash(username + salt + password + privatekey)
Tengo entendido que la creación de cookies de inicio de sesión (sin descifrar las contraseñas) requiere:
- Acceso al código fuente de la aplicación, o una forma de engañarlo para que escupa la clave privada
- Acceso de solo lectura a la base de datos para obtener el salt y la contraseña de hash
Mientras que el método de sesión tradicional requiere:
- Acceso de escritura y lectura a la base de datos (para inyectar la sesión o engañar a la aplicación web para que lo haga por usted)
- Posiblemente el acceso al código fuente depende de cómo funciona
De todos modos, ¿esto parece demasiado inseguro para alguien? ¿Hay alguna manera de mejorarlo y hacerlo más seguro (manteniendo el modelo sin estado / sin sesión)? ¿Hay algún sistema de autenticación existente que use este modelo sin estado?
Además, el método de hashing puede ser básicamente cualquier cosa, desde SHA256 hasta Blowfish