Touch ID 指纹识别的原理
Apple在 iPhone 5s 的发布会上公布了全新的指纹识别安全技术,也就是Touch ID,开创了生物安全识别技术在便携设备上使用的新篇章.
我们注意到,Home按钮上有一圈金属环,这个金属环起到了感应手指的功能,然后唤醒 Touch ID 来读取指纹.
Touch ID 传感器的厚度只有 170 微米,拥有 500 ppi 高分辨率,可读取极小的指纹细节.传感器可从皮肤皮下层指纹的一些小部分拍摄高分辨率图像,然后会分析该信息,根据三种基本指纹类型(弧形纹、箕形纹或斗形纹)将指纹分类,它会绘制比人眼不可见的纹路细节,确保指纹读取准确无误.
Touch ID 可从 360 度方向读取指纹,随后创建指纹的某种数学表达式,并将其与已注册的数据进行比较,以确定是否匹配。如果匹配,便可替代密码来解锁设备或通过其他操作.
根据苹果官方的描述,使用过程中,Touch ID 会向已注册的指纹数据里持续的添加新的特征数据,随着时间的推移,这能不断提高匹配准确度,也能进一步的提高安全性。
Touch ID被破解的概率是五万分之一.
Face ID 面部识别的原理
人脸识别允许解锁iPhone X,通过检测你的面部几何形状,并使用iPhone X A11芯片神经引擎将其与存储的数学模型进行匹配.不过,即使在配置为使用Face ID的设备上,安全的基石仍然是用于加密用户数据的密码.换句话说,Face ID通过减少用户输入密码的频率,使得使用更强的密码更加方便.根据苹果公司的数据,一个随机的人有1 / 100万的概率骗过人脸识别让人相信是你,这比Touch ID的5万分之一的概率有了显著的提高.
这款名为TrueDepth的iPhone X相机使用红外技术创建人脸深度地图,然后将其连同相应的2D红外图像发送到iPhone的Secure Enclave.使用深度信息使得数码照片无法解锁设备,因为它们不包含深度信息.此外,面部识别要求你的眼睛是睁开的,并看着设备,这使得你很难在没有意识到的情况下解锁它(例如,在睡觉时).
人脸识别实际上使用多个神经网络,可以分为两类:人脸识别和抗欺骗.面部识别神经网络可以用于帽子、围巾、眼镜、隐形眼镜和许多太阳镜.反欺骗神经网络的目的是防止使用照片或面具解锁手机.
从红外图像采取的信息构建数学模型并只存储到Secure Enclave.在解锁尝试期间,将存储的模型与人脸的数学表示进行匹配.由于一个人的外貌会随着时间的推移而变化,例如,留胡子或刮胡子,苹果公司已经包含了一种机制来重新训练神经网络,这样它们就可以随着时间的推移而进化,并适应这个人的脸.解锁成功后,自动进行再培训.相反,如果解锁失败,则要求用户输入密码,如果密码正确,则使用新的人脸ID数据对神经网络进行再培训.
除了解锁设备外,第三方应用程序也可以使用Face ID对用户进行身份验证.具体来说,所有与Touch ID兼容的应用程序都将支持Face ID,而无需修改任何代码.
生物信息识别的使用
-
1首先引入LocalAuthentication.framework
/**包含: LAContext.h // LAError.h LAPublicDefines.h LocalAuthentication.h */ #import <LocalAuthentication/LocalAuthentication.h>
-
2 LAError.h
/// 身份验证未成功,因为用户未能提供有效凭据。 LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed, /// 认证被用户取消(例如点击取消按钮)。 LAErrorUserCancel = kLAErrorUserCancel, /// 身份验证被取消,因为用户单击了后退按钮(输入密码)。 LAErrorUserFallback = kLAErrorUserFallback, /// A系统取消了身份验证(例如,另一个应用程序进入前台). LAErrorSystemCancel = kLAErrorSystemCancel, /// 无法启动身份验证,因为设备上没有设置密码. LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet, /// 身份验证被应用程序取消(例如,在身份验证过程中调用invalidate)。 LAErrorAppCancel NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel, /// 实例化的LAContext对象失效,再次调用evaluation...方法则会弹出此错误信息 LAErrorInvalidContext NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext, /// 无法启动身份验证,因为该设备上无法使用生物计量。 LAErrorBiometryNotAvailable NS_ENUM_AVAILABLE(10_13, 11_0) __WATCHOS_AVAILABLE(4.0) __TVOS_AVAILABLE(11.0) = kLAErrorBiometryNotAvailable, /// 无法启动身份验证,因为生物计量学没有登记的身份。 LAErrorBiometryNotEnrolled NS_ENUM_AVAILABLE(10_13, 11_0) __WATCHOS_AVAILABLE(4.0) __TVOS_AVAILABLE(11.0) = kLAErrorBiometryNotEnrolled, /// 身份验证没有成功,因为有太多失败的生物测定尝试,生物测定现在被锁定。解锁生物统计学需要密码,例如评估LAPolicyDeviceOwnerAuthenticationWithBiometrics将需要密码作为先决条件。 LAErrorBiometryLockout NS_ENUM_AVAILABLE(10_13, 11_0) __WATCHOS_AVAILABLE(4.0) __TVOS_AVAILABLE(11.0) = kLAErrorBiometryLockout, /// 身份验证失败,因为它需要显示UI,而使用interactionnotal属性禁止显示UI。 LAErrorNotInteractive API_AVAILABLE(macos(10.10), ios(8.0), watchos(3.0), tvos(10.0)) = kLAErrorNotInteractive,
-
3 LAPublicDefines一些相关的宏定义
-
4 LAPolicy
-
两种鉴定方式:
///设备所有者将使用生物识别方法(Touch ID或Face ID)进行身份验证。需要生物特征认证。 ///如果生物计量学不可用、不可注册或不可锁定, ///则使用LAErrorBiometryNotAvailable、LAErrorbiometrynotenrolled、LAErrorBiometryLockout对该策略进行评估将失败。 ///如果没有密码,生物统计学就不能使用,也就是说,当生物统计学可用时,注册并没有锁定, ///但是没有设置密码,那么使用LAErrorPasscodeNotSet的评估就会失败。 ///Touch ID authentication对话框包含一个默认标题为“cancel”的取消按钮, ///可以使用localizedCancelTitle属性定制该按钮,以及一个默认标题为“Enter Password”的后退按钮, ///可以使用localizedFallbackTitle属性定制该按钮。 ///后退按钮最初是隐藏的,并在第一次触摸ID尝试失败后显示。 ///单击任何一个按钮都会导致evaluatePolicy调用失败, ///返回一个不同的错误代码:LAErrorUserCancel或LAErrorUserFallback。 /// Face ID身份验证从动画化HUD开始。 /// 如果第一次尝试成功,HUD就会消失,不会显示其他UI。 /// 如果第一次尝试失败,LocalAuthentication将显示一个对话框,其中有两个按钮:“Cancel”和“Try Face ID Again”。 /// 第二次失败后,按钮为“Cancel”和“Enter Password”,其语义与Touch ID相同。 /// 生物认证将被锁定后,5次不成功的尝试。之后,用户必须输入密码解锁。 /// 密码可以通过LAPolicyDeviceOwnerAuthentication在锁定屏幕甚至app中输入。 /// 锁定屏幕解锁是首选的用户体验,因为我们通常不希望用户在应用程序的请求下输入密码。 LAPolicyDeviceOwnerAuthenticationWithBiometrics NS_ENUM_AVAILABLE(10_12_2, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0) = kLAPolicyDeviceOwnerAuthenticationWithBiometrics, ///设备所有者将通过生物统计学或设备密码进行身份验证。 ///需要生物识别或密码认证。如果生物统计学是可用的,登记和不锁定,用户首先要求它。 ///否则,他们被要求输入设备密码。 ///如果不启用密码,则使用LAErrorPasscodeNotSet将导致策略评估失败。 ///生物特征认证对话框的行为类似于LAPolicyDeviceOwnerAuthenticationWithBiometrics。 ///然而,代替“输入密码”按钮的是“输入密码”按钮,当点击该按钮时,它会切换身份验证方法并允许用户输入设备密码。 ///密码认证将被锁定后,6次不成功的尝试与逐步增加的后退延迟。 LAPolicyDeviceOwnerAuthentication NS_ENUM_AVAILABLE(10_11, 9_0) = kLAPolicyDeviceOwnerAuthentication
-
LATouchIDAuthenticationMaximumAllowableReuseDuration
///该属性表示从设备解锁后多长时间内不需要重新验证的时间. ///默认值为0,表示不采用设备解锁来授权应用,允许最大的设置时长为5分钟.
-
-
5 使用
- (void)biometricsAuthentication { // 初始化上下文对象 LAContext* context = [[LAContext alloc] init]; NSError *error; NSString *result = @"提示语句"; context.localizedFallbackTitle = @"";//输入密码按钮自定义文字 // 首先判断设备支持状态:canEvaluatePolicy:error: 返回YES:支持 if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { // 支持指纹验证 [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:result reply:^(BOOL success, NSError *error) { if (success) { //验证成功,主线程处理UI } else { switch (error.code) { case LAErrorSystemCancel: { //切换到其他APP,系统取消验证Touch ID break; } case LAErrorUserCancel: { //用户取消验证Touch ID break; } case LAErrorUserFallback: { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ //用户选择输入密码,切换主线程处理 }]; break; } case LAErrorAuthenticationFailed: { /// 身份验证未成功.未能提供有效评剧 break; } case LAErrorTouchIDLockout: { ///TOUCH ID被锁定 break; } case LAErrorAppCancel: { /// 身份验证被应用程序取消(例如,在身份验证过程中调用invalidate). break; } case LAErrorInvalidContext: { /// 实例化的LAContext对象失效 break; } default: { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ //其他情况,切换主线程处理 }]; break; } } } }]; } else { //不支持指纹识别 switch (error.code) { case LAErrorTouchIDNotEnrolled: { ///Touch ID未注册 break; } case LAErrorPasscodeNotSet: { /// 无法启动身份验证,因为设备上没有设置密码 break; } default: { NSLog(@"TouchID not available"); break; } } } }