¿Cómo almacenar de forma segura los datos confidenciales en la aplicación móvil?

4

Quiero desarrollar una aplicación de banco móvil (Windows Phone, Android, iOS) que interactúe con un canal bancario.

La primera vez que el usuario abre la aplicación, comienza el proceso de intercambio de claves y, al final de este proceso, genera un SymmetricKey a largo plazo que debe almacenar en el dispositivo móvil. Todas las solicitudes que se envían al servidor se cifran con esta clave. Si alguien puede robar el SymmetricKey , él / ella puede secuestrar la sesión del usuario. De manera sencilla, puedo almacenar SymmetricKey en formato de texto plano. otra solución es que defina una MasterKey en el Código (Hardcode) y cifre el SymmetricKey con el MasterKey . pero en esta solución existe exactamente un MasterKey para varias instancias de aplicaciones que se instalan en diferentes dispositivos. Si alguien puede descompilar el código de la aplicación móvil y recuperar MasterKey , él / ella puede recuperar SymmetricKey Nuevamente, ¿cuál es la mejor solución para almacenar datos confidenciales en aplicaciones móviles?

Leí acerca de algún método que pertenece al sistema operativo móvil que garantiza que los datos se almacenan de forma segura, pero todos ellos necesitan establecer una cuenta de perfil configurada por el usuario (por ejemplo: Protect() y Unprotect() en Windows Phone que necesita una cuenta de Hotmail conjunto).

¿Puedo generar diferentes claves maestras por dispositivo diferente?

    
pregunta Soheil Ghahremani 26.11.2014 - 12:27
fuente

3 respuestas

7

Solo use TLS, es para lo que estaba destinado: enviar datos de forma segura entre dos partes a través de un canal no confiable.

Si desea protección adicional, hay dos formas de resolver este problema que me vienen a la mente:

  • Use una contraseña para cifrar la clave simétrica
  • Use un token como OTT a través de SMS o generado usando una tarjeta inteligente y un lector de tarjetas externo con un desafío / respuesta

La primera opción protegerá con contraseña la clave simétrica, el efecto secundario es que la única forma segura de implementar esto es que la contraseña solo se guarda temporalmente en la memoria. Esto requerirá que el usuario ingrese su contraseña para descifrar la clave simétrica cada vez que su programa requiera usarla.

La segunda opción es lo que he visto implementado muchas veces y no requiere que se almacene una clave en el dispositivo. Utilizan la tarjeta de cuentas bancarias y un lector de tarjetas externo. Usted genera un servidor de desafío y lo envía a través de TLS (¡no olvide la fijación de certificados!) A su usuario. El usuario ingresa el desafío en el lector de tarjetas que genera una respuesta. Luego, el cliente envía la respuesta al servidor, que puede ser verificada por el servidor.

Recuerde que todo se trata de la evaluación de riesgos , la probabilidad de que alguien pueda o quiera ir tan lejos para obtener su aplicación móvil debe ser evaluada. Como primera recomendación, asegúrese de incluir controles para verificar si el dispositivo está enraizado / desbloqueado o no. Si descubre que el teléfono tiene jailbreak, simplemente no permita el uso de su aplicación y asegúrese de ponerlo en los términos y condiciones de que el riesgo de pérdida de dinero es responsabilidad del cliente al usar dispositivos con jailbreak / rooteado (aunque también es necesario). para tener en cuenta el daño a la reputación).

Asegúrese de tener un montón de controles de cordura en el servidor también para ver a dónde va el dinero. Si de repente un usuario está enviando cantidades de dinero muy por encima del promedio a las cuentas en los países de Europa del Este, podría ser una buena idea bloquear temporalmente la transacción y llamar activamente al cliente para ver si intentaba enviar ese dinero.

    
respondido por el Lucas Kauffman 26.11.2014 - 13:41
fuente
3

Para teléfonos Android, hay un almacenamiento de credenciales que le permite almacenar claves. Se ejecuta como un demonio del sistema y utiliza AES para cifrar las claves. Las claves están vinculadas al UID de la aplicación que lo creó, por lo que otras aplicaciones no autorizadas no pueden acceder a estas claves.

Para iOS, hay un llavero similar que tiene un propósito similar. También está encriptado y en un espacio aislado para que las aplicaciones solo puedan recuperar sus propios elementos de llavero.

No almacene la clave simétrica en texto plano. Aunque el almacenamiento de aplicaciones en Android solo es accesible para la aplicación, existe la posibilidad de que el usuario pueda mover la aplicación a la tarjeta SD, que es un juego justo para todas las aplicaciones con permisos para acceder a la tarjeta SD.

No creo que sea necesaria una clave maestra, ya que tanto el almacenamiento de credenciales como el llavero ya proporcionan cifrado.

Sin embargo, podría ser bueno usar la clave simétrica como un secreto compartido para negociar una nueva clave de sesión para cada sesión, probablemente a través de Diffie-Hellman. Esto le permite tener perfecto secreto hacia adelante.

Por último, estarías tratando con adversarios calificados que intentan comprometer la aplicación ya que hay un incentivo financiero. Te sugiero que busques consejo profesional. No desacreditar a la comunidad aquí, pero los riesgos son bastante altos.

    
respondido por el limbenjamin 26.11.2014 - 13:35
fuente
1

Le sugiero que distribuya la clave en más de un lugar. Por ejemplo

Clave simétrica:

  • divide las claves en dos partes
  • guardar la primera parte en el dispositivo y la segunda parte en el servidor
  • cuando el usuario pueda iniciar sesión correctamente mediante OTP / SMS, proporcione la segunda parte de la clave y cifre / descifre la información confidencial que desee.

Claves asimétricas

  • También puede usar claves asimétricas, donde hay dos claves involucradas (par de claves pública-privada)
  • Uno para el cifrado y otro para el descifrado
  • Enviar clave pública y clave privada de la segunda parte al servidor
  • Entonces el proceso es igual que la clave simétrica.
respondido por el pradeep1991singh 18.11.2016 - 09:08
fuente

Lea otras preguntas en las etiquetas