2012-06-14 25 views
6

Tengo un servicio web que ofrezco a los usuarios para acceder a la base de datos de mis aplicaciones y obtener información. Los usuarios tienen que registrarse para obtener una clave API y proporcionarla al hacer las solicitudes. Todo funciona bien, pero ¿cómo puedo verificar si los usuarios que se registraron para una clave están haciendo la solicitud y no otra persona a la que podría haberle dado la clave?Servicio web REST y claves API

He estado pensando en los últimos dos días para llegar a una solución, pero nada tan lejos.

+0

¿Utiliza JAVA o PHP (o cualquier otra cosa)? – sp00m

+0

idioma del lado del servidor es PHP – slash197

+0

Como respondió @Laurent, podría echarle un vistazo al proceso de OAuth, pero yo propondría el de OAuth2. Incluso si la publicación es un poco antigua, encontrará [aquí] (http://stackoverflow.com/q/4875420/1225328) una implementación PHP de ese mecanismo. PD: Google y Facebook usan OAuth2 para permitir que los desarrolladores se comuniquen con su API. – sp00m

Respuesta

10

Debe utilizar las solicitudes firmadas. Básicamente funciona así:

  • Usted da su usuario una clave de API y un "secreto" (una cadena aleatoria) que sólo usted y el cliente sabe.
  • Cuando realizan una solicitud, le agregan un parámetro de "firma". Esta firma es básicamente un hash de los parámetros de solicitud + la clave API + otros parámetros (ver a continuación) + el secreto.
  • Dado que conoce el secreto también, puede verificar que la firma sea correcta.

Para evitar los ataques de repetición, también puede agregar nonces e indicaciones de fecha y hora en la mezcla. Un nonce es simplemente un número que debe ser incrementado por el cliente en cada solicitud. Cuando recibe la solicitud, comprueba si ya recibió esta marca de tiempo/nonce antes. Si lo hiciste, rechazas la solicitud (porque es muy probable que sea un ataque de repetición). De lo contrario, almacene el nonce/timestamp en su base de datos para que pueda buscarlo más adelante.

Esto es más o menos cómo se firman las solicitudes en OAuth. Eche un vistazo a su ejemplo en el enlace.

+0

¡Gracias! Suena interesante, tengo que verificar esto. – slash197

+0

Si el usuario regala su clave secreta, de todos modos no puede verificar su identidad correctamente. La política (y no la tecnología) debe dictar el uso apropiado de la clave API y la clave secreta. Sin embargo, esta es una buena información. ¿En qué escenario se aplicaría un ataque de repetición: rastreo de tráfico (la clave API/params) o adivinar los parámetros de solicitud? – KyleM

+0

@KyleM, sí, es para prevenir ataques MITM. Supongo que es menos importante si la conexión supera https (como debería ser). –

2

Hay 2 partes para autenticar las llamadas a la API REST. Cuando un usuario se registra con su servicio, normalmente le asignará una LLAVE para identificar a ese usuario. A veces, esto es suficiente. Pero esta CLAVE puede ser compartida o robada. En cuyo caso, su servicio considerará que la CLAVE es válida. Ahora, para evitar el secuestro de claves, etc. también distribuirá una clave secreta. Esta clave nunca se transporta con la solicitud REST API. Esta clave se usa para realizar un hash unidireccional de la solicitud API y crear una firma (HMAC).

Esta firma, más la solicitud de la API (solicitud HTTP en forma de URL) se envía luego al servidor API. El servidor realiza el hash unidireccional de la URL y se compara con la firma con la clave privada de este usuario. Si coinciden, se "supone" que el solicitante tiene acceso a la clave privada y, por lo tanto, la solicitud es válida.

Para evitar los ataques de repetición, además de nonce (como se sugiere en el póster anterior), también puede utilizar el encadenamiento hash.