Esquema de autenticación para una aplicación de Android: cuando la tarjeta SIM está bloqueada o cambiada por otra, la aplicación deja de funcionar

Tengo que implementar una forma conveniente de determinar si una aplicación móvil está siendo utilizada por un cliente válido o no. Mis clientes me dijeron que si iban a perder su teléfono móvil, sin duda se pondría en contacto con el operador y bloquear la tarjeta SIM.

Por lo tanto, parece natural para enlazar la autenticación a la validez de la tarjeta SIM (la aplicación funciona siempre y cuando el SIM correcto esté presente y no esté bloqueado). Entonces, en caso de pérdida, el cliente sólo necesita bloquear la tarjeta SIM, lo que él o ella haría de todos modos (porque los bancos de Internet envían SMS para aprobar las transacciones al teléfono móvil).

He intentado leer datos relacionados con la tarjeta SIM, pero funciona sólo en algunos teléfonos y no en otros (a veces recibo sólo cadenas vacías en lugar del número IMEI).

¿Cómo puedo implementar un mecanismo de autenticación, que es

  1. Fácil para el usuario (no requiere que el usuario genere / ingrese una nueva contraseña),
  2. Proporciona a la aplicación información sobre si la tarjeta SIM insertada actualmente
    1. El SIM que estaba allí en el primer inicio de la aplicación y
    2. ¿No está bloqueado?

Si es imposible, ¿qué alternativas de autenticación hay (aparte de correo electrónico / contraseña y número de teléfono con confirmación por SMS)?

Actualización 1 (11.08.2013 14:17 MSK): Una solución obvia es utilizar el número de teléfono como un nombre de inicio de sesión y número de 6 dígitos generado por el servidor como contraseña.

Entonces, la autenticación funcionaría de esta manera:

  1. En la primera ejecución, el usuario introduce su número de teléfono móvil.
  2. El servidor le envía un mensaje (SMS) con una contraseña de 6 dígitos.
  3. El usuario introduce esa contraseña y la aplicación comienza a funcionar.
  4. En intervalos regulares la aplicación le pide al usuario que renueve la contraseña (las nuevas contraseñas se entregan también a través de SMS).

¿Qué piensas de esta opción?

¿Se puede mejorar de alguna manera?

Si bloquea su aplicación con las propiedades de SIM y requiere que se presenten esas propiedades para desbloquear la aplicación, ¿ha pensado en dónde almacenar esas propiedades en la aplicación (codificado, base de datos, archivo, preferencias, …)? ¿O está pensando en ponerse en contacto con el servidor para su verificación? En ambos sentidos, puede terminar en una solución compleja con posibles fallas de seguridad. El número de serie de SIM es algo único pero al mismo tiempo es público, no puedes confiar en esta propiedad para bloquear tu aplicación.

La clase TelephonyManager es la puerta de enlace para acceder a las propiedades de SIM (esta clase también expone la privacidad de los usuarios de varias maneras). A partir de ahora, no hay API de crypro android expuesto a realizar operaciones criptográficas en el SIM. Sin embargo, dado que su cliente puede ponerse en contacto con el operador, puede considerar pedirle al operador que firme su aplicación. En ese caso, usted puede tener una manera de utilizar su tarjeta SIM como un elemento seguro. Hay una discusión en este hilo. El código PIN basado en un número limitado de intentos es otra forma de implementar una autenticación sencilla para acceder a la aplicación. Puede implementar esto en la capa de aplicación sin involucrar a la tarjeta SIM.

Espero que esto ayude.

bueno. Parece que tienes la mayor parte del flujo ya establecido en tu mente. Estoy agregando algunas cosas específicas:

1. Registro

Los usuarios tendrán que leer explícitamente el número de serie SIM que está físicamente impreso en el lado de la tarjeta SIM y tienen que comunicarle este número de serie (en caso de que estén registrando los usuarios manualmente y sin conexión) .. o los usuarios podrían registrarse en línea Introduciendo este número de serie SIM específico (si su proceso de registro está en línea y dirigido por el usuario). Esto será sólo un registro de tiempo.

No estoy seguro de ninguna manera de encontrar el número de serie de SIM sin sacar la tarjeta SIM fuera del teléfono. Usted puede explorar más.

2. Autenticación

Ahora cada vez que el usuario ejecuta su aplicación, puede leer las informaciones relacionadas con la tarjeta SIM, como el número de serie de la tarjeta SIM, el código del operador, el nombre del operador, el código del país del operador, etc. y comunicar esta información a su servidor Web para que se autentique.

Usted tiene que utilizar las funciones getSimOperatorName() , getSimSerialNumbe() , getSimCountryIso() de TelephonyManager para obtener estos detalles.

Tenga en cuenta que @rajesh ya ha comentado que IMEI no. Se utiliza para identificar el dispositivo y no la tarjeta SIM, por lo que no sirve de nada si desea que la autenticación sea específica de la tarjeta SIM.

3. Comprobación

Además de la autenticación, tendrá que implementar una lógica para ver el estado de la tarjeta SIM (tal vez después de cada intervalo de tiempo específico, o sólo en el momento en que se utiliza su aplicación).

Tendrás que usar la función getSimState() de TelephonyManager para leer los estados:

SIM_STATE_NETWORK_LOCKED – Indica que la SIM está bloqueada por el operador de red. (Por supuesto, cuando el usuario debe haber informado de que bloquea la tarjeta SIM después del evento de pérdida de SIM.) SIM_STATE_ABSENT – Indica que la tarjeta SIM está ausente.

Por consiguiente, puede salir de la aplicación mostrando mensajes adecuados al usuario.

Este enfoque puede ser modificado y utilizado de acuerdo a sus requerimientos. Espero que eso te ayude.

  • Leyendo ActivityManager-logs en un dispositivo de Jelly Bean?
  • ¿Cómo evitar mostrar la pantalla de consentimiento en nuestras propias aplicaciones nativas cuando la autenticación externa?
  • Comprueba si la solicitud HTTP proviene de mi aplicación Android
  • Proteger una API REST para su uso por clientes Android
  • Android: Determinar el tipo de seguridad de las redes wifi en el rango (sin conectarse a ellos)
  • ¿Cómo la emulación de tarjeta basada en software (HCE) garantiza la seguridad NFC?
  • Android Recomendación de seguridad en la aplicación: ¿qué significa esto?
  • Android: Bug con ThreadSafeClientConnManager descargar imágenes
  • ¿Puedo usar el último proveedor de BouncyCastle en Android?
  • ¿Qué problemas de seguridad puede causar SendBroadcast y qué es un enfoque mejor?
  • SecurityException - Nombre del paquete de llamadas desconocido -Android 6.0.1
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.