近来在帮忙处理一个IOS端,指纹/面容登录的需求。 独立的原生IOS开发人员,已经被优化掉了,我是革命一块儿砖,哪里需要哪里搬,-_-|| 。在此,对期间遇到的一些实践问题,做一个梳理备忘,也希望可以给其他产品及码农提供参考。
本文主要侧重于,整体的移动端指纹/面容实现用户登录的解决方案逻辑的概述,并不叙述指纹识别技术原理, 或者API具体编码过程等具体技术细节。
一、移动端指纹识别API能力
虽然实际参与开发的是IOS端,但从最终安卓iOS都能完整实现相关需求的角度推测, 安卓也应当具有相同的 API接口能力。
主要的接口能力应该能支持实现:
1. 判断设备是否支持/开启了指纹识别功能。
2.判断指纹数据是否发生了变化。
3.进行指纹验证过程,服务器托管网验证用户指纹。
用途上来说:
1 比较好理解, 设备是否已启用了指纹识别功能。
3 同样好理解,通俗的说,就是弹出个框,提示用户按指纹,识别成功,失败,取消之类,会有对应的回调通知给应用。
关于2 ,主要考虑的是一个安全场景。提供一种机制,让程序能够判断,设备的指纹识别数据是否发生了变化。具体来说,例如增加了几个指纹, 删除了一些指纹等。安全角度来说,可能是设备更换/增加了一个新的使用用户。应用应该考虑这个场景对其本身账号安全的影响。
一些感觉应该可以,但实际可能并不支持的能力:
1 无法取得具体的指纹数据, 这属于用户隐私
2 无法取得指纹设置,验证的具体信息,例如设置了几个手指,用哪个手指验证成功之类。可能你会认为判断指纹数据变化会依赖于此,但起码在IOS的角度,系统只是提供了一个类似数据签名的机制,你只能比较签名是否发生了变化。而不能取得具体的设置变化信息。
一个重要的概念变化:
区别于账号,手机验证码等登录方式,指纹登录的一个重要概念变化在于,指纹登录鉴权的是对设备有使用权的生物特征,这些服务器托管网特征可能属于一个或多个人,并不与应用的账号一一对应。
用户角度,具体来说,你的pad,设置了通过你和你老婆的指纹可以对设备进行指纹解锁。 你pad 上安装了一个银行app,里边存着你的私房钱,同时登录这个App后按照APP的提示,设置了指纹登录。以后就可以方便的使用指纹来登录这个APP,查看你的私房钱余额。很多人没有意识到,如此一来,你老婆也可以通过她的指纹,来登录这个应用,方便的查看你的余额了。
因为对于系统而言,你录入指纹在同一个当前系统用户时(通常是这样),系统是无法区别,是你的两个手指,还是一个是你的,一个是你老婆的。根据账号独占原则,系统的理解是, 这两个指纹是你的两根手指,都代表了你。
这个概念的变化,会需要一些app,基于此做出一些安全上和功能上的考虑。
二、简陋而基本的指纹登录流程
1. 使用账号/密码,鉴权方式登录应用,应用内激活指纹登录功能。
2. 应用记录了指纹登录功能的开启, 同时记录指纹登录对应的账号/密码于本地。
3. 登录界面调用API的指纹验证过程。验证通过则取出记录的账号/密码信息,进行自动登录。
上面的流程虽然简陋,忽略了很多问题。但是他体现了实现指纹登录的基本原理。
原理来说,在启用指纹登录时,记录用户的日后可用于登录鉴权的凭证于本地(上述而言是密码),当用户交互通过指纹验证后,使用保存的鉴权凭证进行登录鉴权。
三、较完善的方案
前面简述的简陋流程,忽略遗留的问题。
1.如果用一个新的账号密码,登录系统后,也同样启用了指纹登录,第一个账号的指纹登录对应凭据会被覆盖,只能支持一个应用账号启用指纹。
2.如果账号修改了密码,指纹登录将会失效。
3.如果设备的指纹数据发生变化,设备更换了使用者,或者录入了新的指纹。没有做安全上的考虑。
4.其他安全考虑。启用指纹登录功能的身份核验,抵抗重放等。
完善如下:
1. 如前所述,指纹验证仅鉴权,使用者是否有权使用设备,与应用账号并非一一对应,因此一对多的情况必须人为选择。UI上可能是通过指纹验证后,显示一个开通指纹用户的列表,用户自行选择要登录哪一个。简陋的方案中描述的其实是限定了,指纹登录,只绑定最后一个开通的账号信息。
2. 指纹登录的凭据使用密码引起的耦合,因此要为指纹登录提供独立的鉴权凭证。并可能需要提供类似密码的对应配套管理机制,如重置,过期之类。具体实践,可以用UUID,由服务器生成进行发送之类。
3. 通常应对数据变化做出对应处理,禁止登录,并清空指纹凭证。可以使用API提供的对应机制能力进行判断。
4. 其他一些细节的安全考虑。通信要加密;启用指纹登录功能时,应当验证是否为账号拥有者(验证账号密码),以确保其知情;登录凭据可以配合挑战码签名使用,以避免被重放攻击。
拜了个拜~
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
#define _CRT_SECURE_NO_WARNINGS 1 #include int bin_two(int a) { int count = 0; printf(“奇数位为:”); for (int i = 30; i>=0; i-=2)//3…