Comunicación segura del servidor en una aplicación de Android

1

En primer lugar, no tengo una sólida formación en seguridad de la información y solo necesito algunas pautas básicas para mi pregunta. Se publicó la misma pregunta en el intercambio de criptografía, pero este parece ser un lugar mucho más apropiado.

Por lo tanto, hay una aplicación de Android y un servidor HTTP (S) remoto. Para acceder a la funcionalidad del servidor, la aplicación necesita recibir un token (generado para cada dispositivo individual basado en la identificación del dispositivo), y para hacerlo, debe proporcionar una clave API válida.

Suponemos que la comunicación con el servidor es segura y que el peligro principal de un ataque es hacer una ingeniería inversa de la aplicación. No existe una defensa al 100% contra la ingeniería inversa, pero el ejecutable dex de la aplicación (código de bytes de máquina virtual) se confunde con herramientas especializadas.

Entonces, la pregunta es ¿cuál es la mejor manera de almacenar la clave API?

Actualmente estoy considerando dos opciones:

  1. la clave API se almacena dentro de la parte del código nativo de la aplicación, no En texto plano, pero encriptado con un algoritmo que es muy complejo. y, por lo tanto, es más difícil hacer ingeniería inversa que el bytecode VM. Así que necesito un método para eliminar el ataque de repetición, donde un atacante puede simplemente llamar a un Función nativa específica y obtener la clave. Asumimos que todos los nativos. El código es una caja negra para un atacante.
  2. No use una clave de API fija en absoluto, pero use algún tipo de API dinámica clave para autenticar en el servidor para recibir un token. Más implementar Todas las cosas relacionadas con la seguridad en el código nativo.
pregunta bvk256 26.12.2016 - 12:16
fuente

1 respuesta

2
  

La clave API se almacena dentro de la parte del código nativo de la aplicación, no en texto simple, sino encriptada con un algoritmo que es muy complejo y, por lo tanto, más difícil de revertir la ingeniería que el bytecode de VM. Así que necesito un método para eliminar el ataque de repetición, donde un atacante puede simplemente llamar a una función nativa específica y obtener la clave. Suponemos que todo el código nativo es un cuadro negro para un atacante.

Esto es seguridad a través de la oscuridad. Si bien tiene algún sentido reducir la velocidad del atacante, no es de ninguna manera un mecanismo para proporcionar seguridad real, por ejemplo. Prevención de ataques.

  

Entonces, la pregunta es ¿cuál es la mejor manera de almacenar la clave API?

Para definir las defensas que necesita para definir el modelo de amenaza: ¿contra qué tipo de amenazas está protegiendo? Usuario de ingeniería inversa? Aplicaciones de malware? ¿Rootear remotamente el dispositivo a través de alguna vulnerabilidad? Estos vectores de amenaza sugieren diferentes defensas.

Al separar la seguridad a través de la oscuridad, es posible que desee proteger la clave API criptográficamente:

  1. Hazlo aleatorio y criptográficamente fuerte (por ejemplo, fuerza bruta)
  2. Cifrelo con un secreto, que no se almacena en el dispositivo: PIN / contraseña / huella digital.
  3. Si te estás protegiendo contra el propietario del dispositivo (que se siente un poco por lo que estás escribiendo), no hay una buena táctica de prevención de amenazas, lo siento.
  4. Para evitar ataques de reproducción, necesitará una clave dinámica, que se actualiza con cada comunicación exitosa con el servidor.

Notas:

  1. Intenta evitar encrypted with an algorithm that is very complex and thus harder to reverse engineer than VM bytecode , porque eso abusa del principio de Kerckhoffs ( enlace 's_principle), y te lleva a lugares oscuros.
  2. Confíe en una buena criptografía comprobada y administre el secreto correctamente. Derivar / esconder el secreto cerca de los datos protegidos terminará mal tarde o temprano, eso es seguridad de acero a través de la oscuridad, una buena característica adicional pero sin fundamento para una buena seguridad.
respondido por el Eugene 26.12.2016 - 14:52
fuente

Lea otras preguntas en las etiquetas