Desde el principio, me gustaría saber si hay una biblioteca o norma ampliamente utilizada que podría adoptar para reemplazar mi esquema "personalizado". Estoy seguro de que yo, como una sola persona, no puedo producir algo mejor que una biblioteca producida por la comunidad.
Dicho esto, soy un novato en seguridad, y al revisar otras implementaciones no encontré una que pareciera satisfacer mis necesidades exactas. Probablemente estaba justo debajo de mi nariz y no lo entendía.
Estoy desarrollando una api tranquila y un cliente javascript. Tengo la intención de implementar honestamente descanso e ir sin estado, es decir, sin sesiones del lado del servidor. Toda la información para responder a cualquier solicitud debe ser pasada por el cliente al servidor como parte de la solicitud.
La solución de seguridad debe proporcionar protección contra un atacante remoto de terceros que esté moderadamente resuelto.
No tengo la intención de proteger contra un atacante que se encuentre bajo la custodia física de los sistemas cliente o servidor.
Entonces, con todo eso en mente, aquí está mi solución :( solución.
- HTTPS en todo el sitio
- En el registro en el servicio, la contraseña del usuario se pasa 'clara' al servidor donde se almacena en un hash sha-3 con sal.
- Al iniciar sesión, el cliente javascript no pasa la identificación de usuario y la contraseña al servidor. En su lugar, genera una cadena aleatoria y la almacena en el espacio de window.name. Luego utiliza esta cadena como frase de contraseña para realizar el cifrado AES de 256 bits en el nombre y la contraseña, almacenando este texto cifrado en una cookie. Esta galleta tiene una vida de 1 hora.
- En adelante, todas las llamadas a la API requieren que el cliente acceda a la cadena window.name, descifre la cookie y pase el nombre de usuario / contraseña 'borrar' al servidor. También se pasa una marca de tiempo unix-epoch.
- El servidor, al recibir cualquier solicitud, recupera la sal del usuario, realiza un hash sha-3 en la contraseña y lo compara con el valor almacenado en la db. También garantiza que la marca de tiempo se encuentre dentro de los 60 segundos de la hora del servidor.
- Si esas comprobaciones pasan, el cliente se considera autenticado para esa única solicitud.
Definitivamente no soy un experto en seguridad, pero creo que este foro sí lo es. Cualquier cosa que sugieras, la tomaré en serio.