Que es la forma más segura de incluir un par de clave (público / privado) en un apk

Estoy desarrollando una aplicación para Android y tengo que mantener una comunicación segura con un servidor a través de un par de clave privada y pública. ¿Cuál es la forma más segura de almacenar la clave privada en mi apk? Obviamente voy a ofuscar el código pero quiero más seguridad. He pensado la siguiente opción:

Si creo una biblioteca de recursos nativa con los métodos para firmar la información de transacción, el apk sólo tiene que contener el archivo .so y este archivo está en código de máquina, por lo que la descompilación podría ser difícil, ¿no?

¿algunas ideas? Gracias

Guarde el par de claves en un almacén de claves e incluya el almacén de claves como recurso en su APK. Android tiende a preferir el formato BouncyCastle Key Store (BKS) . Keystores están diseñados específicamente para este propósito.

Tenga en cuenta que debe proteger el almacén de claves con una contraseña y su aplicación necesitará saber esa contraseña para acceder al almacén de claves. Por lo tanto, se queda con la necesidad de pedir al usuario una contraseña para acceder a la almacén de claves o incluir la contraseña en su código (ofuscarlo para que sea más difícil para un atacante para hacer ingeniería inversa). Si alguien se va a los problemas de la ingeniería inversa de su aplicación para recuperar su keystore encriptado y la contraseña necesaria para acceder a ella, incluida la contraseña en una biblioteca nativa compilada no presentará gran parte de un obstáculo adicional.

Sin embargo, es posible que no necesite hacer esto de todos modos. Si su objetivo es proteger / cifrar los datos en el transporte hacia / desde el servidor, utilice SSL / TLS. Si no está haciendo la autenticación del lado del cliente, su servidor necesita un certificado SSL pero su cliente no lo hace; El protocolo se encarga de generar las claves de cifrado para usted de una manera segura. Si desea que el servidor autentique el cliente (hágalo para que el servidor solo hable con sus clientes), necesitará instalar un certificado SSL del cliente con su aplicación … esta es la clave privada que está Probablemente pensando en.

También señalaré la seguridad de la aplicación para la plataforma Android . Este libro (noticia: escribí el libro) tiene un capítulo entero hablando de cómo diseñar comunicaciones de aplicación a servidor seguras de Android, con ejemplos de código para ilustrar cómo implementar las protecciones adecuadas. Es posible que desee darle una lectura.

En primer lugar, para implementar una comunicación segura entre su aplicación cliente y un servidor, conceptualmente hablando, sólo necesita la clave pública del servidor. Eso le permite establecer una relación de confianza unidireccional con el servidor y establecer una sesión segura, en la que se garantiza la identidad del servidor.

Aunque ciertamente el método anterior no proporciona confianza bidireccional (el cliente no puede identificarse con el servidor), al establecer el canal de comunicación en la mayoría de las aplicaciones, este nivel de confianza no es realmente necesario.

Si sus requisitos son proporcionar la autenticación del cliente al servidor usando las llaves públicas / privadas entonces las cosas se complican más porque si usted pone la llave en el apk, no importa cuánto lo ofusca (incluyendo incrustarlo en una biblioteca nativa) solamente Ralentizar un usuario nefasto dedicado.

La única forma de almacenar la clave privada con el cliente es cifrarla. Pero entonces usted tiene un problema similar de dónde almacenar la clave de descifrado. La solución más fácil es generar un par de claves públicas / privadas para el usuario de la aplicación cliente y pedirle al usuario que proporcione una clave de cifrado / descifrado simétrico (que el usuario siempre tendrá que teclear) para descifrar la clave privada cada vez que la clave Usuario está utilizando la aplicación.

La alternativa sería utilizar algún tipo de dispositivo de hardware criptográfico dedicado similar a una tarjeta inteligente que almacenaría la clave privada de forma segura, pero todavía tiene el problema de autorizar su aplicación para leer la clave del dispositivo (sin mencionar la complicación de la interfaz Con dicho dispositivo).

Ahora, la pregunta que tienes que hacerte es esta: "¿A quién intentas impedir que leas la clave privada?" (Por supuesto después de responder a la otra pregunta: "¿Realmente necesita un par de claves público / privado para el cliente" ).

  • Keytool's -storepass vs. -keypass - ¿Por qué 2 contraseñas?
  • Hacer que el teclado Android resista a los ataques de KeyLogger
  • Proteger la cadena constante contra la ingeniería inversa
  • Java.security.cert.CertPathValidatorException: Ancla de confianza para ruta de certificación no encontrada. Android 2.3
  • SDK para Android: ¿Cómo comprobar el facebook la tecla Hash?
  • Construcción de BoringSSL y Conscrypt y agrupación con Android apk
  • SecurityException: no se permite realizar OP_READ_PHONE_STATE
  • Secretos de OAuth en aplicaciones para móviles
  • ¿Qué protege las contraseñas de AccountManager de Android de ser leídas por otras aplicaciones?
  • Android - Almacenamiento de datos confidenciales en la base de datos sqlite
  • ¿Es posible escribir un wifi cracking util para teléfonos Android? Modo de monitor vs Multicast?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.