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).
- ¿Qué tan seguras son las API de GeoLocation en dispositivos móviles?
- Cómo validar el origen de una invocación de servicio web
- Usar bloqueo de pantalla en mi aplicación
- ¿Cómo almacenar módulo, exponente público y exponente privado de forma segura en Android?
- Android Central Keystore
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
- Fácil para el usuario (no requiere que el usuario genere / ingrese una nueva contraseña),
- Proporciona a la aplicación información sobre si la tarjeta SIM insertada actualmente
- El SIM que estaba allí en el primer inicio de la aplicación y
- ¿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:
- En la primera ejecución, el usuario introduce su número de teléfono móvil.
- El servidor le envía un mensaje (SMS) con una contraseña de 6 dígitos.
- El usuario introduce esa contraseña y la aplicación comienza a funcionar.
- 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?
- SDK para Android: ¿Cómo comprobar el facebook la tecla Hash?
- Comprobar si existe URL o no en Servidor
- ¿Existe una forma más segura de almacenar la cadena sensible en un proyecto de Android?
- ¿Cómo guarda de forma segura una orden en la nube, si no puede verificar el pago desde la nube?
- ¿Cómo verificar los datos de POST se envía desde la aplicación de Android con la firma SHA1 correcta?
- Cómo jugar tonos DTMF en android a través de auriculares programatically?
- ¿Cómo puedo evitar que otras aplicaciones de iOS / Android utilicen mi API RESTful?
- Proveedor de contenido privado de Android?
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.