2012-08-06 15 views
5

Así que estoy trabajando en una aplicación móvil ahora mismo que hará solicitudes a una API REST construida con Django.¿Cómo comparto la clave secreta de mi aplicación móvil con el servidor la primera vez que la genero?

Para asegurar la API, planeo usar un sistema de autenticación de par de claves privadas/públicas.

El flujo de trabajo que he pensado es algo como esto:

  1. El usuario inicia sesión en el uso de Facebook
  2. Una vez que el usuario firma la aplicación genera una clave
  3. La clave privada privada es compartida entre el servidor y la aplicación para que el servidor sepa asignar esa clave privada a un usuario específico.
  4. Cada vez que la aplicación móvil realiza una solicitud, la aplicación genera una HMAC/firma utilizando los parámetros de solicitud y la clave privada. Además del HMAC, la aplicación también envía el user_id del usuario que lo envió (esto actuará como la clave pública).
  5. Cuando el servidor recibe la solicitud, genera su propio HMAC. Toma el user_id y busca la clave privada en una tabla. Al usar la clave privada, recrea el HMAC con los parámetros de solicitud y lo compara con el HMAC que envió la aplicación móvil. Si el servidor y el móvil tienen HMAC coincidentes, entonces realiza la solicitud.

Ahora mi problema se encuentra en el paso 3, donde la clave privada debe compartirse de alguna manera entre la aplicación móvil y el servidor. ¿Cómo puedo enviar de forma segura la clave privada?

Respuesta

4

Comenzaría preguntando por qué la parte del servidor de su aplicación necesita saber la clave privada. Si solo quiere autenticar a un usuario, solo necesita la clave pública y la identificación del usuario, y la identificación del usuario no puede ser la clave pública (necesita una forma de averiguar qué clave pública usar).

Por ejemplo, el proceso de compartir la clave, el paso tres, podría ser algo como esto:

  1. La aplicación genera un par de claves pública y privada.
  2. La aplicación envía la clave pública al servidor, sin importar quién puede interceptarla.
  3. El servidor almacena esa clave pública, asociándola con la identificación proporcionada por el usuario.

Tal vez la integración en Facebook es la parte que hace esto imposible. No entiendo muy bien cómo Facebook entra en este proceso completo.

Una cosa que puede hacer que la transferencia de una clave sea ligeramente más segura es usar múltiples canales para transferirla.

Por ejemplo, su aplicación podría enviar la clave privada que se generó utilizando su API REST pero cifrándola con un esquema de cifrado simétrico. La clave de cifrado simétrica se puede enviar a través de otro medio, como el correo electrónico, o mediante SMS, ya que esta es una aplicación móvil, o tal vez incluso una llamada telefónica automática a un número proporcionado por el usuario que se registra. La clave puede ser una frase de contraseña aleatoria que genera la clave de cifrado simétrica real, para asegurarse de que es algo que puede escribir el usuario. Luego, para desbloquear la aplicación, el usuario debe ingresar esta frase de contraseña en una pantalla y la clave secreta se desbloqueará.

Nuevamente, esto solo mejora la seguridad de la transferencia por un pequeño margen, especialmente considerando el hecho de que si puede interceptar la transmisión de la clave privada, probablemente pueda interceptar el correo electrónico que contiene la frase de contraseña. En mi opinión, no enviar la clave privada al servidor no solo sería óptimo sino también obligatorio.

Cuestiones relacionadas