Asegurar una API privada que sea visible en la Internet pública

1

Estoy haciendo una API para mi propio software. La API utilizada actualmente para registrar usuarios, ver información de usuarios y actualizar información de usuarios.

En el futuro se utilizará para facturación, soporte, etc. ...

La API actualmente se puede ver en línea, solo la seguridad actualmente es que para ver o actualizar la información de los usuarios que necesita para conocer su ID única, que es un número aleatorio entre 1 Billion y 2 Billion.

El único cliente para mi API será mi propio front-end que aún no he escrito.

Leí sobre HMAC y OAuth y ambas soluciones parecían extremadamente complicadas.

Estas son mis ideas actuales para mantener mi API segura:

 1. Use HTTPS for all requests.
 2. Don't tell anyone the address of the API (I know I probably shouldn't rely on this)
 3. Send an access key and a secret key to the API and the 
    API sends back a token that is valid for 1 hour. (Maybe less)

¿La clave de acceso, la clave secreta y HTTPS serían suficientes para proteger mi API?

    
pregunta Francis 07.07.2016 - 21:14
fuente

3 respuestas

1

Respuesta rápida: no es suficiente para proteger su API. Cada uno de esos pasos tiene puntos débiles que no se ha solucionado al unirlos. La buena criptografía es difícil, e intenta no reinventar la rueda.

Https: evitará que las llamadas exactas se vean en tránsito. Pero no al final del usuario, o a un ataque de "hombre en el medio".

Ocultar un número: busque "seguridad por oscuridad". Tl; Dr no confíe en esto. Siempre.

Pase un token válido durante una hora: se ve abierto a todas las formas de autenticación e intercepción en el planeta. ¿Cómo sabes que el token no está siendo mal utilizado o utilizado por nada excepto por el cliente previsto? Usted no.

    
respondido por el Stilez 09.07.2016 - 09:47
fuente
1
  1. Más difícil de implementar, más trabajo.

  2. Los clientes simplemente pueden ingresar a las herramientas de desarrollo de Chrome y acceder a Red para ver dónde se envía la solicitud.

Esto es lo que hago para asegurar mi api. Construyo con una pila MEAN y utilicé JSON Web Tokens. Yo uso una biblioteca llamada passport.js para autenticar. Así es como protejo:

Digamos que tengo una ruta api como tal:

UserRoutes.post('/message', Middleware.verifyToken, function(req, res) {
      //post message and save to DB
});

Note que usé Middleware.verifyToken arriba en el "medio". Esto se llama desde la clase a continuación

Luego tengo un archivo en otro lugar llamado Middleware.js y dentro de un método:

verifyToken: function() {

//grabs the json web token from the authorization header and verifies its valid. //If it is valid then continue will the route logic

}

Estos son los pasos:

  1. Asigne a un usuario un token web Json cuando inicie sesión (almaceno el mío en LocalStorage) (utilicé las bibliotecas: jsonwebtoken, passport-jwt, passport, bcrypt).
  2. Implemente una función de middleware que verifique el token. Esto asegurará que el token / usuario sea válido antes de que se ejecute la lógica real de la ruta.

El concepto general es que el usuario debe presentar un token web json válido con cada solicitud, y este token se comprueba antes de que se ejecute la lógica de ruta. Si no es válido o no existe, la ruta no se ejecutará y puede devolver un error a quien lo haya realizado.

Me tomó cerca de un mes o dos para poder implementar completamente este sistema porque me tomó un tiempo aprender y entender passport.js y middleware, pero una vez lo hice fue genial y definitivamente vale la pena el tiempo que toma aprender.

Investigación: Middleware, Json Web Tokens y Passport.js

enlace
enlace

    
respondido por el nd510 12.07.2016 - 18:20
fuente
1

Mi análisis:

  
  1. Use HTTPS para todas las solicitudes.
  2.   
  3. No le digas a nadie la dirección de la API (sé que probablemente no debería confiar en esto)
  4.   
  5. Envíe una clave de acceso y una clave secreta a la API y al   La API devuelve un token que es válido durante 1 hora. (Tal vez menos)
  6.   
  1. Debe activar un encabezado HSTS para asegurarse realmente de que está usando HTTPS para todas las solicitudes
  2. Seguridad a través de la oscuridad. ¿Por qué no ponerle una contraseña? Nota: asegúrate de guardar la contraseña de forma segura con bcrypt y un salt. Aquí hay una excelente explicación de Tom Scott. Cualquiera puede ver la URL abriendo las herramientas para desarrolladores y visitando peticiones.
  3. Posiblemente seguro, dependiendo de cómo lo implementes. No intentes implementar tu propia suite criptográfica. Es una realmente mala idea
respondido por el noɥʇʎԀʎzɐɹƆ 12.07.2016 - 19:14
fuente

Lea otras preguntas en las etiquetas