4

我需要实现一种方便的方法来确定有效客户是否正在使用移动应用程序。我的客户告诉我,如果他们的手机丢了,他们肯定会联系运营商并锁定 SIM 卡。

因此,将身份验证绑定到 SIM 卡有效性似乎很自然(只要存在正确的 SIM 卡且未锁定,该应用程序就可以工作)。然后,万一丢失,客户只需要锁定 SIM 卡,他或她无论如何都会这样做(因为网上银行会向手机发送批准交易的短信)。

我试图读取与 SIM 卡相关的数据,但它仅适用于某些手机而不适用于其他手机(有时我得到的只是空字符串而不是 IMEI 号码)。

如何实现身份验证机制,即

  1. 易于用户使用(不需要用户生成/输入新密码),
  2. 为应用程序提供当前插入的 SIM 卡是否为
    1. 与第一次启动应用程序时的 SIM 卡相同,并且
    2. 没锁?

如果不可能,有哪些身份验证替代方案(除了电子邮件/密码和带有 SMS 确认的电话号码)?

更新 1 (11.08.2013 14:17 MSK):一个明显的解决方案是使用电话号码作为登录名和服务器生成的 6 位数字作为密码。

然后,身份验证将像这样工作:

  1. 在第一次运行时,用户输入他或她的手机号码。
  2. 服务器向他或她发送一条带有 6 位密码的消息 (SMS)。
  3. 用户输入该密码,应用程序开始工作。
  4. 应用程序会定期要求用户更新密码(新密码也通过短信发送)。

你觉得这个选项怎么样?

它可以以某种方式改进吗?

4

2 回答 2

5

如果您使用 SIM 属性锁定您的应用程序并要求提供这些属性以解锁应用程序,您是否考虑过在应用程序中存储这些属性的位置(硬编码、数据库、文件、首选项...)?或者您是否正在考虑联系服务器进行验证?无论哪种方式,您最终都可能会遇到一个可能存在安全漏洞的复杂解决方案。SIM 序列号是独一无二的,但同时它是公开的,你不能依靠这个属性来锁定你的应用程序。

TelephonyManager 类是访问 SIM 属性的网关(该类还以多种方式公开用户隐私)。到目前为止,还没有公开的 android crypro API 用于在 SIM 中执行加密操作。但是,由于您的客户可以联系运营商,您可以考虑让运营商为您的应用程序签名。在这种情况下,您可能有办法将他们的 SIM 卡用作安全元件。有关于这个的讨论线程基于有限尝试次数的 PIN 码是另一种实现简单身份验证以访问您的应用的方式。您可以在应用层实现这一点,而不涉及 SIM 卡。

希望这可以帮助。

于 2013-08-11T10:10:25.183 回答
0

好的。似乎您已经在脑海中设定了大部分流程。我添加了一些具体的东西:

1. 注册

用户必须明确阅读印在 SIM 卡侧面的 SIM 序列号,并且必须将此序列号传达给您(以防您手动和离线注册用户).. 或者用户可以自己在线注册通过输入这个特定的 SIM 序列号(如果您的注册过程是在线的并且是用户驱动的)。这将只是一次注册。

如果不从手机中取出 SIM 卡,我不确定是否有任何方法可以找到 SIM 序列号。你可以更多地探索它。

2. 认证

现在,每次用户运行您的应用程序时,您都可以读取 SIM 卡的相关信息,例如 SIM 卡的序列号、运营商代码、运营商名称、运营商国家代码等,并将这些信息传达给您的 Web 服务器以进行身份​​验证。

您必须使用TelephonyManager的函数getSimOperatorName(),getSimSerialNumbe()来获取这些详细信息。getSimCountryIso()

请注意,@rajesh 已经评论说 IMEI 没有。用于识别设备而不是 SIM,因此如果您希望验证特定于 SIM 卡,则没有用。

3.检查

除了身份验证之外,您还必须实现一个逻辑来查看 SIM 卡状态(可能在每个特定时间间隔之后,或者仅在您的应用程序被使用时)。

您必须使用getSimState()TelephonyManager 的功能来读取状态:

SIM_STATE_NETWORK_LOCKED- 告知 SIM 卡已被网络运营商锁定。(当用户在 SIM 丢失事件后必须报告锁定 SIM 时,当然可以。 SIM_STATE_ABSENT- 告诉 SIM 卡不存在。

因此,您可以通过向用户显示合适的消息来退出应用程序。

可以根据您的要求修改和使用此方法。我希望这对你有帮助。

于 2013-08-19T06:56:07.247 回答