Comprobación de que el mensaje provenía de un punto específico de aplicación / punto final

Estoy tratando de construir un sistema seguro para la transmisión de datos de una aplicación cliente de Android a un servidor web que ejecuta PHP.

Lo que quiero hacer es asegurarse de que el sistema es criptográficamente seguro de tal manera que los mensajes de la aplicación puede ser verificado como realmente de la aplicación en sí, en lugar de ser de un usuario tortuoso que puede haber escrito un script personalizado o tal vez utilizando cURL con el fin de jugar el sistema.

Hay una serie de casos de uso para este tipo de verificación, por ejemplo: –

  • Si una aplicación contiene un anuncio con el que recopila métricas, debería comprobar que los datos de clic se envían desde la aplicación en lugar de hacerlo desde un usuario malintencionado que ha descubierto su API y está enviando datos falsos.

  • Es posible que la aplicación tenga una encuesta de elección múltiple y, de nuevo, desea asegurarse de que se están recopilando los resultados de la encuesta de la aplicación.

  • La aplicación está recopilando trazas GPS y desea asegurarse de que los datos se envían desde la propia aplicación.

En cada uno de estos casos, debería asegurarse de que el origen de los mensajes sea la propia aplicación y no sólo un usuario que ejecute un script sencillo para falsificar los datos.

Algunas ideas que he considerado: –

  • SSL – Funciona bien para proteger el canal y prevenir la manipulación (que cumple algunos de los requisitos), pero todavía no puede garantizar la integridad de la fuente de los datos.

  • Criptografía de clave pública : la aplicación cliente puede cifrar los datos con una clave privada y luego transmitirla al servidor donde se puede decodificar. El problema es que la clave privada necesita ser codificada en la aplicación: la aplicación podría ser descompilada y la clave privada extraída y luego utilizada para enviar datos falsos.

  • Algoritmos hechos en casa – Una pregunta muy similar a esto se pregunta aquí donde las soluciones sólo funcionan hasta que "alguien descubra su algoritmo" – es decir, no es una gran solución!

  • Cadena de hash – Esto parecía una forma muy interesante de usar claves de una sola vez para verificar cada carga de datos del cliente al servidor, pero de nuevo depende de que la aplicación no esté descompilada, porque la contraseña todavía debe ser almacenada por la aplicación .

Mi conocimiento limitado de la criptografía me hace pensar que en realidad es teóricamente imposible construir un sistema que sería totalmente verificable de esta manera, porque si no podemos confiar en el cliente final o el canal, entonces no hay nada sobre el que basar cualquier confianza .. ¡pero quizá hay algo que he pasado por alto!

No es tan difícil, sólo tiene que autenticar la aplicación. Puede hacerlo con un simple usuario y contraseña (a través de SSL) o utilizar la autenticación de cliente. En ambos casos, las credenciales deben estar en la aplicación y un atacante puede extraerlas e imitarlas. Tienes que salir con él y tal vez implementar algunos métodos para mitigarlo.

También puede autenticar los mensajes, haciéndolos firmar con una clave asimétrica (RSA, etc.) o una simétrica (HMAC, etc.). Un nonce ayuda contra repeticiones, donde alguien captura un mensaje validamente firmado y lo envía a su servidor una y otra vez. Dependiendo de su protocolo, la sobrecarga de usar uno podría ser demasiado.

Para proteger las credenciales, puede hacer que el cliente las genere y las guarde en el sistema KeyStore , aunque no es totalmente compatible con una API pública, consulte aquí algunos detalles. Esto, por supuesto, requiere un paso extra donde se necesita enviar las credenciales generadas (digamos, clave pública) a su servidor de forma segura, lo que podría ser difícil de implementar correctamente.

Hagas lo que hagas, no intentes inventar tu propio algoritmo o protocolo criptográfico, usa uno establecido.

  • ¿Es OAuth en un teléfono móvil usando un servidor proxy demasiado problema?
  • Cordova App en Android usando SSL enviando multipart / form-data causes Error de la aplicación de rack: # <EOFError: cuerpo de contenido incorrecto>
  • Android WebView setCertificate emite problemas de SSL
  • SSLProtocolException haciendo una conexión https
  • Alerta de seguridad de Google Play para TrustManager inseguro
  • Conexión de Https con conexión cerrada por peer en Android 6.0
  • ¿Cómo hacer un HTTPS POST de Android?
  • Ignorar el certificado SSL Comprobar en Android React Native
  • Habilitación de protocolos SSL específicos con Android WebViewClient
  • HttpClient falla con Handshake Falló en Android 5.0 Lollipop
  • Soporte para Android SSL - SNI
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.