使用移动设备ID作为身份验证的附加因素(您拥有的东西)

介绍

如果您是最终客户使用的移动应用程序的生产商,那么使用移动设备上的唯一永久设备标识符(设备ID)来跟踪安装了哪些设备的移动应用程序至关重要。 除了独特的移动设备ID可能具有的许多用途之外,您还可以使用它来提高移动应用程序的可用性和个性化(不在本文讨论范围之内),唯一设备ID的安全性领域的主要优势之一是可以保持与特定用户相关联的特定设备的跟踪。 然后,如果用户使用其他设备登录到您的站点(或服务器端API),则可以通过SMS或电子邮件发送的一次性密码(OTP)来挑战用户,从而引入其他身份验证因素在用户标识和认证过程中。

在此博客文章中,我将介绍一些最佳方法,这些方法可为android和ios移动应用程序创建设备ID,以通过将移动设备链接到用户帐户来将设备ID用作身份验证的“要素”。

移动设备ID的关键要求:

在开始解决如何生成设备ID的解决方案之前,以下是永久性设备ID才能生效的一些主要特征:

1. 设备ID必须能够承受App Upgrade的影响 。 我们知道移动应用程序提供商会定期发布对移动应用程序的升级。 如果每次应用程序升级时设备ID都发生变化,则移动用户将在每次应用程序升级时通过OTP受到挑战,从而使用户体验恶化,并导致用户对移动应用程序的疲劳和放弃。 因此,最重要的是,应用程序的设备ID在两次应用程序升级之间不发生变化,从而为用户减轻了不必要的身份验证工作量。

2. 设备ID需要在Mobile OS备份和还原以及Mobile OS升级中保留下来 。 当用户回退和还原Mobile OS或再次升级Mobile OS时,永久设备ID也不应更改。

3. 设备ID必须是加密随机的,因此发生冲突的可能性很小 。 对于成千上万的移动用户而言,设备ID在全球范围内是唯一的非常重要,因为没有两个用户会获得相同的设备ID。 令人高兴的是,许多研究已经针对此问题进行了研究,移动应用程序开发人员无需担心该怎么做–只需使用现有的解决方案即可完成此操作,而无需编写自己的解决方案(如下所述)。

在哪里生成永久移动设备ID

在安装应用程序期间,可以在服务器端以及移动应用程序本身上生成永久的移动设备ID。 尽管两者都有其优点和缺点,但我个人的建议是使用移动应用程序本身生成永久移动设备ID,只是为了使用移动设备上可用的OS功能来这样做,并减轻了服务器的一些负担。 Google Play API最近开始提供服务器端即时ID,以为您的移动设备提供全局设备ID,这也是创建设备ID的可行选择。 您选择的内容将完全取决于您的用例。

客户端(在移动设备上)生成设备ID

  • 可以在应用安装过程中生成
  • 无需网络通话即可获取设备ID
  • 可以使用设备的处理能力
  • 好消息是所有主要的移动OS使得在设备端生成非常简单。

在服务器上生成设备ID

  • 适用于所有平台的一致实施,包括iOS,Android,Windows
  • 更好的控制和更可预测的设备ID
  • 独立于移动操作系统

在Apple iOS上生成移动设备ID的选项

在Apple iOS设备上,有几种创建设备ID的方法。 其中包括CFUUID,NSUUID,OpernUDID,IDFV,广告ID和UDID。 杰伊·格雷夫斯(Jay Graves)撰写的这篇博客文章非常出色地详述了几个选项,并对所有选项进行了很好的比较和特性。 您可能可以根据用例使用其中之一,但通常来说,我强烈建议您将NSUUID用于iOS 6+上的移动应用程序,并使用CFUUID来支持比iOS 6早的任何事物,以用于上述识别和验证用例。

对iOS 5或更早版本使用CFUUID

与NSUUID相似,只是代码中的一种不同实现方式

CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);

NSString * cfuuidString =(NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault,cfuuid));

对iOS 6和更高版本使用NSUUID

  • 创建一个随机的128位通用唯一ID
  • 它根本不持久
  • 应用程序需要将其存储在设备钥匙串中,还需要将其存储在NSUserDefaults中,以防在应用程序升级期间更改配置文件
  • NSUUID较新,并且具有不错的现代Objective C接口
  • UUID(通用唯一标识符),也称为GUID(全局唯一标识符)或IID(接口标识符),是128位的
  • 价值观。 由NSUUID创建的UUID符合RFC 4122版本4,并使用PRNG使用随机字节创建。
  • 几乎没有碰撞的机会
  • “仅在接下来的100年中每秒生成10亿个UUID之后,仅创建一个副本的可能性就约为50%”
  • 例如:68753A44–4D6F-1226–9C60–0050E4C00067
  • 使用本机代码非常容易调用:

NSString * uuid = [[NSUUID UUID] UUIDString];

在Android设备上生成移动设备ID的选项

对于Android移动设备,就像Apple设备一样,有多个选项可以生成设备ID。 这是在Android设备上生成设备ID所需的所有选项。

Android ID

  • 首次启动手机时产生的64位数量
  • 问题
  • 手机擦拭时重置
  • 在2.2之前的版本中并非100%可靠
  • 一家主要制造商的流行手机中至少存在一个广为人知的错误,其中每个实例都具有相同的ANDROID_ID

IMEI或MEID或ESN(设备ID)

  • Android允许检索GSM的IMEI和CDMA手机的MEID或ESN
  • 问题
  • 它不能可靠地工作
  • 当它起作用时,该值将在设备擦拭后仍然存在(“恢复出厂设置”),因此当您的一位客户擦拭其设备并将其传递给另一个人时,您可能最终会犯下令人讨厌的错误。
  • 您必须要求用户获得读取设备状态的附加权限

MAC地址

  • 从Android M开始,可以从设备的WiFI或蓝牙硬件中检索Mac地址
  • 问题
  • 不可靠,因为并非所有设备都具有WiFI
  • 如果未打开WiFi,则硬件可能无法报告Mac地址

序列号

  • 从Android 2.3(“姜饼”)开始,可通过android.os.Build.SERIAL获得
  • 没有电话的设备需要在此处报告唯一的设备ID; 有些手机可能也会这样做
  • 问题:
  • 不可靠的

随机UUID

  • 最好的选择之一是使用UUID作为标识符,并在应用程序初始化或安装后首次运行时简单地创建一个新的标识符。
  • 随机UUID是使用RFC 4122的变体2,Leach Saltz变体生成的,而Android提供了一种在添加代码中非常轻松地生成它的方法。
  • 以下是在您的android应用代码中生成UUID的方法:

字符串uniqueID = UUID.randomUUID()。toString();

实例ID

还有另一种更好的机制,可以使用Google Play提供的服务器端移动服务为您的移动应用创建唯一标识符。 它可以在iOS,Android和Chrome应用程序/扩展程序上运行。 它涉及在您的应用程序代码中导入Google Play服务SDK,然后在应用程序运行时获取实例ID。 如前所述,这是服务器端生成唯一设备ID的方式。 这是为您的移动应用程序创建UUID的另一个非常好的选择。 您将需要最好的判断,是使用实例ID生成客户端UUID还是服务器端UUID将最适合您的用例。

在您的应用代码中实施

我上面针对iOS(NSUUID),Android(Random UUID)和Android(Instance ID)提到的三种最佳方法会创建非持久性的唯一标识符。 对于Apple设备,您必须将设备ID存储在设备钥匙串中;对于Android设备,UUID需要存储在该应用程序的内部存储中,因此该UUID不能与其他应用程序共享。 建议在应用程序生命周期内遵循以下行为。

结论

如上文所述,iOS和Android还有许多其他标识符。 您必须查看根据用例使用的最佳标识符。 但是,截至2017年2月,我上面提到的iOS(NSUUID),Android(Random UUID)和Android / iOS(Instance ID)的三种方法是为移动应用程序实例创建唯一设备标识符的最佳方法。用于将用户帐户链接到设备标识符,然后如果用户来自的设备标识符未映射到针对该用户帐户的设备标识符,则向用户询问。