黄浏展
摘要:苹果自iphone5S推出了指纹识别实现指纹解锁功能,随后在IOS8开放了touch ID接口。本文对iPhone的指纹识别技术进行了简要介绍,并对指纹识别技术在IOS开发中的应用进行了详细阐述。
关键词:指纹识别;IOS;App;登录
引文
指纹是每个人所具有的生理特征,并且每个人的指纹都是独一无二的,每个人的指纹在图案、断点和交叉点上各不相同,它也不会随着年龄的变化而发生变化。正因为指纹所具备的独特的特征,被广泛用作个人的身份识别。
指纹识别技术是利用人类指纹的唯一性,通过对指纹图案的采样、特征信息提取并与库存样本相比较的过程来实现身份识别的技术。与帐号加密码、充值IC卡等传统的身份识别手段相比,指纹识别技术具有不会丢失、不会遗忘、唯一性、不变性、防伪性能好和使用方便等优点,目前应用在侦讯、门禁、电脑、手机、考勤、支付等领域。
随着智能手机的普及和移动互联网的发展,人们日常工作生活中越来越多的事务通过手机来完成。越来越多的应用要求用户通过输入密码来登录,密码难以记忆,输入起来麻烦,使用起来极为不便。如果能利用指纹识别技术来实现各种APP的登陆将极大的方便用户,为用户提供更好的体验。本文将介绍IOS开发中,如果使用苹果touch ID实现指纹登陆。
2苹果指纹识别技术介绍
2.1苹果指纹识别技术原理
2013年苹果公司在iphone5S上首次使用指纹识别功能实现手机的解锁。在手机的Home键内植入指纹识别芯片,利用射频传感器直接读取真皮层的指纹,生成精准的指纹图像。通常得到的指纹图像是灰度图。为了提取指纹特征,首先将灰度图转化成计算机能处理的二进制图像。Touch ID芯片会根据3种基本指纹类型(弧形纹、箕形纹或斗形纹)将指纹分类,提取指纹纹路中的特征点,包括纹路的起点、终点、分叉点和毛孔的位置等。然后将该手指的特征点数据加密之后保存为数学表达式。通过指纹识别进行身份验证的过程就是再次执行以上过程,然后将获得的指纹与已经注册的指纹数据进行比对,如果匹配则指纹解锁成功。
从以上描述可以看出苹果的指纹识别技术有以下几个特点:第一、基于第三代生物射频指纹识别技术(射频原理真皮指纹核心技术(线型采集器)),通过传感器发射出微量射频信号,穿透手指的表皮层去控测里层的纹路,以便获得较精准的指纹图像。而且获取的是真皮层的指纹特征,防伪指纹能力增强。第二、保存的并非指纹本身,而是指纹的特征数据,并且经过加密处理。第三、指纹数据保存在本地,而非云端,并且目前是不可以获取指纹数据的。以上三点从一定程度上保证了指纹识别的安全性。
2.2TouchID在APP开发中的应用
2.2.1指纹识别的应用
Iphone5s添加指纹识别后,仅仅将指纹识别用于手机的解锁。iOS8发布以后,在其SDK开放了TouchID的接口。该接口提供的函数主要实现两个功能,判断当前设备是否支持指纹识别功能和指纹验证。前面已经介绍,苹果指纹识别并不会保存指纹到云端,也不提供获取指纹的功能,因此其指纹识别仅针对当前使用设备,并且不能存储指纹,只能对当前设备的指纹识别进行验证。根据苹果官方的介绍Touch ID目前主要应用在两个方面:用于Key Chain加密和用于授权。
根据苹果指纹识别的原理,目前指纹识别技术在IOS开发中的应用主要是指纹识别登录App。App登录后,一段时间不用或者其它原因使其进人后台运行,当用户重新将APP唤醒至前台时,一般要求输人密码,这个时候可以利用指纹识别来代替密码输入,为用户提供便利,省去输入密码的繁琐,也减少密码被盗的风险。
2.2.2 Touch ID接口介绍
IOS8以后,苹果对开发者开放了Touch ID接口,可以通过Touch ID进行身份认证,下面接口简单介绍。
Touch ID用于身份认证的所有的接口都在LocalAuthentication框架中,该框架包含了三个头文件:LAContext.h,LAError.h,LAPublicDefines.h。LAContext.h用来评估认证策略,允许应用程序要求用户使用个人信息,如注册信息或Touch ID的个人信息来验证自己的身份。LAError.h中定义了一些错误信息代码。实际用到的函数有两个,如下所示。
上述两个函数都是LAContext的成员函数。目前LAPolicy有两个值:LAPolicyDeviceOwnerAuthe-nticationWithBiometrics和LAPolicyDeviceOwnerA-uthentication。第一个值表示设备必须使用touch ID认证识别,如果设备不支持或者没有设置指纹,则不能通过认证;第二个值表示设备可以通过touchID和密码来认证识别,当不能使用指纹识别时则使用密码。
如果canEvaluatePolicy函数返回值为YES,表示设备支持指纹识别,那么可以调用evaluatePolicy:函数进行指纹识别了。调用evaluatePolicy函数后会弹出一个alert。该alert可定制的只有两处:loca-lizedReason参数指定提示框的提示信息,用来向用户说明使用Touch ID的目的;LAContext的locali-zedFallbackTitle属性用来设置密码输入框的形式,如果不设置的话,默认提示是“Enter Password”。如果该属性设置为空,该按钮会被隐藏。
弹出Alert后有三种方式退出验证(alert会被dismiss,reply回调会被调用):用户指纹通过验证;用户点击“Enter Password”按钮,通过输入密码验证;用户点击“Cancel”按钮,取消指纹验证。
在指纹验证过程中,如果用户输入了错误的指纹,这种情况下,提示框控件不会被dismiss,其标题会由项目名称变为为“Try Again”,并有弹簧状的动画效果过渡。如果连续三次验证错误,则取消指纹验证。
3指纹识别的应用实践
前面已经提到目前指纹识别在ios开发中的应用主要是指纹识别登录APP,下面将就其如何实现提出一种思路并详细进行阐述。
3.1指纹验证综述
在使用各种APP的时候,用户一方面希望能保证安全,避免信息被盗,保护自己的隐私,另一方面又希望用起来方便。有些APP每天被反复登录使用,但用户又不想反复的去输入密码,同时还要保证别人不能随意看到自己的信息。这个时候就可以使用指纹验证功能来达到该目的。目前有越来越多的应用使用了指纹验证功能来实现应用从后台到前台的用户验证,如qq,支付宝等。
要实现指纹验证功能,主要分两个步骤,第一步验证并开启设备的指纹识别功能;第二步从后台到前台的指纹验证。
3.2验证并开启设备的指纹识别功能
3.2.1实现逻辑
在APP开发中实现开启指纹验证功能,只是一种模拟效果,因为真正开启该功能只能在设备的系统设置中。如图1所示,可以利用UISwitch控件模拟一种开启指纹解锁的效果,当点击开关处于开启状态时,弹出如图所示的指纹验证窗口,通过触摸Home键通过指纹验证,表示APP支持指纹识别。保存开关控件的状态,同时设置一个Bool变量来保存是否支持指纹识别的状态。如果switch处于开的状态,则将这两个Bool变量都保存为YES,否则都为NO,表示不支持指纹识别,同时Switch处于关闭状态。这个设置,一般在用户登录APP后,在APP的安全设置中。
3.2.2关键代码
touch ID接口主要提供了两个函数用于指纹识别,在开启指纹识别时(点击switch开关),会调用这两个函数来实现指纹识别。首先要判断设备是否支持指纹识别功能,下面列出主要代码。
上述代码中,如果验证成功,一般通过主线程来处理相关操作。如果验证失败,则根据LAError.h文件中的错误代码来做相应的处理,如LAErro-rAuthenticationFailed表示因为用户提供了错误的指纹没有验证成功。
3.3指纹验证
APP从后台进入前台,必须通过指纹验证才能重新进人,这样可以确保应用在使用后没有即时退出造成的风险。要达到这个目的,有两个前提条件。第一是当前APP是开启了指纹识别;第二是APP已经登录了,并处于有效使用时间内。如果开启了指纹识别,同时APP处于登录有效时间内,那么APP从后台进入前台时,则进入如图3所示界面,通过指纹识别来重新进入APP。在图3界面点击指纹图标,进入图4所示界面,然后通过指纹识别解锁。指纹识别解锁过程和前述的开启指纹识别过程类似。也是分为两步,第一步,设备是否支持指纹识别;第二步,如果支持指纹则通过指纹验证。代码实现过程也基本相同,不同的是本次指纹验证成功后进人APP进入后台前的相应界面。
需要进一步说明的是APP如何来判断是否已经登录,并处于有效使用时间内。这个问题可以通过token机制来处理。token值称为登录令牌,用来判断当前用户的登录状态,是服务器根据用户的信息(账号/密码/身份认证机制等)来生成的用于标识用户身份的值。当用户首次登录成功之后,服务器端就会生成一个token值,并将其保存在服务器的数据库中,同时将token值返回给客户端。客户端可以将其保存在沙盒中,作为一个公共参数。客户端再次发送网络请求(不一定是登录请求)时,就会将这个token值附带到参数中发送给服务器,服务器接收到客户端的请求之后,会取出token值与保存在数据库中的token值做对比,如果两个token值相同则说明用户登录过并且当前用户处于登录状态。如果没有这个token值,表示没有登录成功。如果客户端的token值和数据库中保存的不一致,这说明原来的登录信息已失效,也就是用户的token值已超出有效时间。token不仅有有效时间,而且只要调用登录接口并且登录成功,都会在服务器生成新的token值,原来的token值就会失效。
4指纹识别验证方法改进
前面提到的指纹验证过程是APP登录后,通过token判断APP是否在有效使用时间内,为其加的指纹锁,实际上APP已经登录,所以并非真正通过指纹验证来登录。也可以将指纹识别集成在APP中,实现指纹识别登录APP功能。下面将介绍在APP中如何集成指纹识别实现指纹登录。
4.1设计思路
iPhone指纹的存储和验证都是通过Home键来完成的,APP开发者并不能获取用户的指纹和识别用户的指纹。因此实现指纹登录实际上还是针对特定设备,也就是在用帐号密码登录APP时,先要将其与设备绑定。不管是开启指纹识别还是指纹登录都是针对当前使用设备,在设计中考虑和设备进行关联。
4.1.1开启指纹识别
开启指纹识别的设计思路和前述方法一致,将switch开关前的标签改成开启指纹登录。然后在指纹识别验证通过后,将APP登录帐号密码和设备关联绑定,过程如下。TouchID验证通过后,根据当前已登录的账号和硬件设备Token,生成设备账号和密码。设备的帐号和密码生成规则可以通过不同方式,因用户不需要直接使用此处密码,密码可以尽可能的长和复杂。将设备帐号密码保存在keych-ain,以便进行指纹登录时读取。
设备帐号和密码只是用于指纹登录时读取,与服务器数据库保存的数据进行比较,用户不会直接接触和使用该账户密码,所以可以设置复杂的规则。比如说账号可以用硬件token或者原账号加密处理后的字符串,密码用APP密码进行md5加密再和设备token进行某种运算等。
生成设备账号、密码后,将原账号及设备账号、密码,加密后发送到服务端进行绑定。最后服务器端验证原账号及设备账号有效后,返回相应状态,绑定成功则完成整个TouchID(设备)绑定流程,APP开始指纹识别成功。
4.1.2指纹登录
APP开启了指纹识别登录后,当用户账号退出后,可以使用指纹登录。在登录按钮下面会添加一个“指纹登录”按钮(如图5所示)。若当前设备未绑定,则不会出现“指纹登录”按钮。
单击登录界面的“指纹登录”按钮,调用TouchId接口检测当前设备是否支持TouchID,如果支持则发起TouchID验证(如图6所示)。指纹验证通过,说明是机主本人。读取APP存储在keychain中的设备账号、密码,调用设备登录接口,发起登录请求。服务器端验证设备账号、密码后,返回相应状态,通过验证则登录成功,完成整个TouchID登录流程。
4.2 keychain保存用户名、密码
指纹登录其实最终还是通过账号和密码登录来实现,指纹通过验证后,APP在后台调用登录接口,自动获取keychain保存的账号密码登录。下面将介绍keychain保存和获取账号和密码的方法。
keychain是IOS为开发者提供的一种安全的保存私密信息(密码,序列号,证书等)的方式,每个IOS程序都有一个独立的keychain存储。keychain是通过加密存储的,相对于NSUserDefaults、文件保存等方式,keychain保存更为安全。因此使用keychain来保存登录账号密码是一种较好的方式。
在应用里要使用keyChain,首先需要导人Security.framework,keychain的操作接口声明在头文件SecItem.h里。可以直接使用SecItem.h里方法操作keychain,也可以使用apple官方的两个工具类:KeychainltemWrapper和SFHFKeychainUtils。下面将列出使用KeychainltemWrapper类实现的主要代码。
5结束语
虽然touch ID只提供了指纹验证,不能获取指纹和利用指纹数据,但只要很好的利用其接口,将指纹识别技术集成到APP中,就可以实现类似于APP指纹登录的效果。包括指纹支付,也可以采用类似的设计加以实现。这可以给用户带来便利,让用户有更好的体验。