Esquema de seguridad de API / cliente de descanso personalizado

0

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.

    
pregunta user36581 02.01.2014 - 17:12
fuente

1 respuesta

1
  

HTTPS en todo el sitio

Esto es bueno.

  

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.

Esto es malo. Hash contraseñas con un algoritmo de hash de contraseña lento como pbkdf2 , bcrypt o scrypt en su lugar.

  

Al iniciar sesión, el cliente javascript no pasa el ID 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 cookie tiene una vida de 1 hora.

     

De aquí 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 esté dentro de los 60 segundos de la hora del servidor.

Esto me parece demasiado complejo. Simplemente puede pasar el nombre de usuario y la contraseña a través de HTTPS al servidor durante el inicio de sesión. Si la autenticación se realiza correctamente, genere un token aleatorio en el lado del servidor y devuélvalo al cliente. Cualquier solicitud futura debe incluir ese token para que se considere autenticado. Puede invalidar el token después de un cierto período de tiempo en el lado del servidor si es necesario.

    
respondido por el Ayrx 02.01.2014 - 17:24
fuente

Lea otras preguntas en las etiquetas