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:
- 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.
- 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.