一种事件驱动的生物特征识别框架服务的设计与实现
2018-12-25蒋林轩刘晓东吴庆波孔金珠
蒋林轩,余 杰,刘晓东,吴庆波,孔金珠
(1.国防科技大学 计算机学院,湖南 长沙 410073;2.天津麒麟信息技术有限公司,天津 300300)
0 引言
生物特征识别是指利用人的部分身体部位所具备的生理学特性进行认证的一种技术。随着近些年来移动终端的普及、用于生物特征采集与识别的传感器越来越小,生物特征识别技术已经普及到人们的日常生活中。
生物特征识别主要分为特征采集和特征认证。特征采集是利用生物统计学原理和计算机算法,将传感器从人体特征部位收集到的光学、声学、力学等信息进行特征提取并编码,转换为唯一的数字编码,并将这些编码通过各种方式合成一个对应个体身体部位的特征模板。特征认证是将当前采集到的生物特征码与数据库中的指定历史特征模板比对,如果比对匹配,则代表认证通过,比对不匹配则认证不通过。
在主流的操作系统中,几乎都支持了生物特征识别。大多数操作系统都是以服务的形式提供生物特征的统一采集和比对识别,少数操作系统只提供算法库和设备驱动,不提供统一的服务。
1 相关工作
对于用户来说,生物特征识别是一个新的、快速、高效以及安全的认证方式,因此在操作系统层面使用生物特征识别认证是很有必要的。本节将描述当前流行的通用操作系统上的生物特征识别框架,并对比其优缺点。
1.1 Windows平台上的生物特征识别服务
Windows中的生物特征识别服务各组件间集成度比较高,总的来说可以分为三层[1]:认证服务层、核心层和驱动层。
认证服务层定义应用接口,使用核心层各个模块的功能为上层的前端应用提供统一的接口。核心层为服务层提供功能性接口,为驱动层定义驱动接口并提供存储服务。驱动层负责实现核心层的功能接口,并操控硬件完成接口功能。
Windows的生物特征识别服务结构如图1所示,认证服务层由生物特征识别框架应用接口和Windows生物特征认证服务组成;核心层由生物特征认证服务提供者及其三个模块、生物特征识别驱动接口组成;驱动层由各种传感器组成[2]。各组成部分完成如下功能。
图1 Windows生物特征识别服务结构
生物特征识别框架应用接口(Windows Biometric Framework API):Windows生物特征识别框架提供的面向应用的统一管理接口。
Windows生物特征认证服务(Windows Biometric Service):一个特权服务,通过使用兼容Windows生物识别驱动程序接口(WBDI)的驱动程序来管理所有生物识别设备。
生物特征认证服务提供者(Windows Biometric Service Provider,WBSP):Windows生物识别服务的一个组件,用于管理特定类别的生物识别技术,如指纹识别技术。WBSP内置在Windows生物识别服务中,并且它们不是插件,不支持第三方BSP。
传感器模块(Sensor Adapter):一个生物特征识别的插件式组件,提供了配置传感器、捕获样本,并且控制生物特征数据输入到引擎模块。
引擎模块(Engine Adapter):一个生物特征识别的插件式组件,通过规范化数据、提取数据特征、匹配样本数据与现有模板等操作来处理样本。
存储模块(Storage Adapter):一个生物特征识别的插件式组件,用于存储、管理和检索模板。
模板数据库(Template Database):一个小型的数据库,存放生物特征的模板数据。
生物特征识别驱动接口(Windows Biometric Driver Interface):一套用于驱动和管理指纹传感器的标准抽象接口。
设备驱动(Device Driver):管理特定指纹传感器,对生物特征识别驱动接口的一种特定实现。
1.2 Android平台上的生物特征识别服务
Android的生物特征识别服务分为两层:后端服务层和生物特征识别的可信执行环境(Trusted Execution Environment,TEE)[3]。
Android的特征识别服务结构如图2所示,后端服务层定义应用程序调用的特征识别接口,提供访问TEE中的特征数据的Keystore服务和API,并通过HAL层使用传感器驱动。生物特征识别的TEE由硬件供应商提供的传感器驱动库和Keymaster硬件加密组件组成。各个组成部分完成如下功能[4]。
图2 Android生物特征识别结构
生物识别接口:Android生物特征识别框架提供面向应用的统一管理接口。Android 9及更高的版本可以直接调用,而Android 8.0及更低的版本需要中间兼容库来调用特征识别接口。
生物特征认证服务:系统中的一个单例进程,它负责与进行生物特征认证的守护进程通信。
生物特征认证守护进程:一个binder接口的实例,封装了生物特征HAL厂商给定的传感器驱动库。
Keystore API和Keymaster:为可信执行环境(TEE)中的安全密钥存储提供硬件加密支持的组件。
生物识别HAL:硬件供应商对生物特征HAL层的实现。其中HAL包含运行在TEE中的传感器驱动库。特定供应商的驱动库只和指定的硬件通信。
1.3 Linux平台上的生物特征识别方案
Linux下的生物特征识别目前只有指纹识别这一种,并且不是以服务的形式存在,而是以指纹识别库的形式存在。
Linux的指纹识别是由libfprint[5]库来完成的。libfprint库提供了部分指纹扫描仪的驱动,并提供应用指纹识别接口完成指纹的采样和比对。
libfprint库主要分为三个部分[6]:指纹识别接口、指纹识别算法库和图像传感器驱动,如图3所示。
图3 Linux生物特征识别结构
指纹识别接口提供应用程序使用指纹识别硬件的应用级接口。指纹识别算法库提供指纹识别算法,从图像传感器拿到指纹硬件采样的指纹图片,通过算法转换为指纹特征值和指纹模板[5]。图像传感器驱动用于控制硬件采集指纹图像。
libfprint只是一个收集指纹图像、生成指纹模板、比对指纹是否匹配的运行时库,对于指纹的存储由应用来定义。在目前的Linux系统上,默认的指纹数据都是明文存储在用户的home目录中,无特殊权限,用户执行的任意程序都能随意访问、修改指纹数据。并且,由于libfprint不提供统一存储功能,各个应用程序可以自己获取指纹信息,自己定义存储,导致应用间的指纹数据无法通用,使得用户需要在每一个使用指纹识别的应用中都录入自己的指纹,这种交互逻辑重复低效,用户体验非常差。
1.4 各平台生物特征识别方案对比
Windows、Android、Linux三个平台上,生物特征识别的方案各不相同。下面将从支持场景、认证架构、假面方式、存储位置、存储方式、安全性和支持的特征类型7个方面对比分析各个方案的优缺点。对比项及结果参见表1。
在支持的场景上,三个平台的方案都支持系统的登录、锁屏以及应用程序使用生物特征完成功能。
在认证架构上,Windows平台和Android平台都是后端服务的形式,为上层应用提供生物特征服务。而Linux平台上是以动态链接库的形式存在,需要应用程序在使用功能的时候重新探测并初始化设备,也需要应用程序自己释放设备资源。
在加密方式上,Windows平台使用软件加密算法来加密特征,Android平台使用硬件芯片中的Key加密,Linux平台下则直接将特征明文存储在系统中。
表1 各平台生物特征识别方案对比
在特征存储的位置上,Windwos平台将数据存储在系统数据库中,Android平台将数据存储在可行执行环境(TEE)中,Linux平台下则是直接存储在用户目录下的文本文件中。
在存储方式上,Windwos平台和Android平台都是统一管理统一存储,所有应用共用特征。而Linux平台下,特征是由应用各自存储,如需共用特征则需要应用自己协调。
在安全性上,Windwos平台由于使用加密的系统数据库,因此安全性高;Android平台由于使用硬件芯片中的Key加密特征,并存储在TEE中,因此安全性非常高;Linux平台由于特征未加密,并随意存储在用户目录下,导致应用可以随意读取修改特征信息,因此安全性低。
在支持的特征类型上,Windwos平台支持指纹、人脸识别,并且可以扩展虹膜、指静脉、声纹等不同的生物特征类型的识别;Android平台支持指纹、人脸、虹膜识别,并且可以扩展指静脉、声纹等生物特征类型的识别;Linux平台只支持指纹识别,并且不能扩展其他生物特征类型。
2 基于多种生物特征识别技术和事件驱动的生物特征识别框架服务(BFS)
与Windows、Android相对比,目前Linux上的生物特征识别库存在以下不足:
(1)无服务,无守护进程:libfprint是一个运行时库,无法提供持续性服务。并且在多个应用同时使用libfprint来操作同一个应用的时候,会出现硬件资源的争用,而libfprint不提供锁机制,从而导致libfprint库和应用程序的崩溃。
(2)安全性低:默认的指纹数据以明文的形式存放在用户home目录中,任意程序都可随意访问、修改指纹数据,导致认证极不安全。
(3)无统一存储:libfprint不提供统一存储服务,各个应用只能自己存储和使用自己录入的特征,导致用户在使用应用的时候需要重复录入自己的特征。
(4)支持的生物特征类型少:由于libfprint库方案只适用于指纹,因此Linux上没有统一的指静脉、虹膜、声纹等认证服务。
由于Linux平台下生物特征识别方案只有libfprint库这一种,这些不足与缺点暂无其他解决方法,因此本文为Linux上生物特征识别设计并实现了一个新的底层服务:生物特征识别框架服务(Biometric Framework Service,BFS),用于提供统一的生物特征识别认证,进行统一的加密存储。
本文设计并实现的生物特征识别框架服务(BFS)支持多种生物特征识别。BFS为应用层定义了生物特征识别的应用接口,为设备提供商定义了生物特征识别的驱动接口,提供统一的生物特征服务,提供统一的存储管理,提供统一的驱动配置管理。
BFS分为三层:服务层、核心层和驱动层(如图4所示)。服务层定义了生物特征识别的应用接口,提供了驱动管理、设备管理、事件管理、状态反馈机制。核心层定义了生物特征识别的驱动接口,定义了设备驱动的实体,提供了生物特征模板的统一存储与加密方式。驱动层主要由设备提供商完成驱动编写,用于实现对生物特征识别驱动接口,操作硬件设备。
图4 生物特征识别框架服务(BFS)结构
2.1 基于事件驱动的BFS服务层
由于生物特征识别的交互行为具有使用频率低、交互时间长、交互方式多样化的特点,BFS的服务层使用事件驱动的方式为上层应用提供服务,并提供状态和交互提示变更的通知。
BFS服务层是一个基于事件驱动的服务,使用DBus总线为上层应用提供生物特征识别的应用接口。生物特征识别应用接口是事件接口,每当应用程序调用应用接口时,都会发出一个事件,BFS服务收到事件后开始事件处理。在处理过程中,服务层会检测设备状态和交互状态的变更,并通过DBus信号通知应用程序。
服务层的处理分为两个阶段:初始化阶段、事件处理和消息反馈阶段。
初始化阶段主要完成驱动的加载与初始化,设备预初始化,已连接设备的探测,USB热插拔事件处理函数和状态变更处理函数的注册,DBus服务的注册和时间循环,流程如图5所示。
图5 生物特征识别框架服务结构
完成初始化部分后,服务开始事件循环,等待应用程序的服务请求事件。
当应用程序调用应用接口后,服务层检测到事件,开始处理事件。服务层首先检测应用是否有调用该接口的权限,权限通过后通过核心层调用设备开始进行生物特征交互。在交互过程中,设备的状态和用户的交互会随时变化,流程如图6所示。
图6 事件处理及消息反馈流程
例如在指纹或指静脉特征录入过程中,会需要用户按下或者抬起手指,交互状态会在按下手指和抬起手指间变更。此时驱动会设置不同的交互状态码,服务层通过核心层检测到交互状态变更后,会发送DBus事件通知信号,通知应用底层已更新交互状态。应用调用服务层的辅助接口,将交互码翻译成交互字符串,完成人机交互的信息更新。
2.2 基于多生物特征的BFS核心层
由于可用于生物特征识别的生理特征部位种类很多,各类特征的采样形式和交互方式都不一致,因此对于一个支持多种生物特征的识别服务来说需要一个足够广泛的抽象模型与结构,才能支持多种生物特征。
BFS核心层基于对指纹、指静脉、虹膜和声纹的交互行为的分析,总结并抽象了设备与驱动的结构,定义了设备操作的基本接口、扩展接口和辅助接口,梳理了系统账户、人与硬件特征采样值的关系,设计并实现了统一的数据存储方式。
并且BFS的核心层沿用Linux/UNIX的接口设计哲学:“提供机制而不是策略”,分离出了具体生物特征识别算法,只提供算法与服务连接的机制,提高核心层兼容性与鲁棒性。具体的生物特征识别算法由驱动层完成。
通过以上方式,BFS核心层目前支持指纹、指静脉、虹膜、声纹四种生物特征的识别。并且BFS具备强扩展性,能够快速地扩展掌纹、人脸等识别算法[7]。
BFS核心层定义的设备及其驱动的结构如图7所示,包含了设备和驱动的各种分类信息、核心层需要的辅助状态和设备的操作集合。
图7 设备及其驱动抽象与数据结构
BFS核心层对各类生物特征采集设备操作的抽象与拓展分为三个部分:基本接口、扩展接口和辅助接口。基本接口完成基础的硬件操作;扩展接口完成用户使用时常用的硬件操作;辅助接口用于管理硬件设备和对接驱动层。结构如图8所示。
传统Linux上libfprint的实体映射关系是:系统账户-人- 个人的十个手指。这种映射关系固定了系统账户和人之间是一一映射的关系,然而现实生活中,常常有单系统账户对应多人的映射关系,例如家庭用户和系统管理员。并且这种映射关系限定死了只能使用十个手指,也就是只能录入十个指纹,从而导致对指纹采集和认证时手指的角度、力度、干湿程度要求都很高。
BFS核心层综合其他各种生物特征,将系统实体的对应关系延伸拓展,使用某个部位的特征信息作为判断依据,使用采样信息作为最终的存储单位建立映射关系,并且不再限定采样或者特征的数量。系统E-R图如图9所示。
图9 设备操作接口的抽象与拓展结构
图10 声纹、指静脉特征录入过程
图11 特征搜索过程
在进行生物特征识别的时候,生物特征的采样信息质量会影响到识别的通过率。例如,在指纹识别的时候,手指放在指纹仪的角度、手指与指纹仪的重合程度、手指的干湿程度都会影响到指纹比对的结果。
BFS核心层将特征识别的粒度减小到特征的某次采样上,并且不再限定采样的次数和特征信息的个数,通过增加样本集数据量可以换取更高的识别通过率。
2.3 BFS驱动层
BFS核心层抽象出来的接口在具体硬件上的实现构成了BFS的驱动层。在驱动层中,每一款硬件对应一个驱动。
驱动层负责完成对核心层定义的驱动接口的实现,并提供生物特征识别的算法(策略)。目前,BFS底层使用开源项目libfprint提供指纹识别算法,使用govpr提供基于GMM-UBM的声纹识别算法。
3 实现与评估
3.1 实现
本框架服务在Ubuntu Kylin 16.04开发,并在Ubuntu Kylin 18.04、Ubuntu Kylin 18.10平台上完成适配。采用C/C++语言开发,代码约为15 000行,主要包括服务程序、核心库、框架驱动与命令行管理工具。
生物特征和指静脉特征的录入操作运行图如图10所示。
静脉的查找过程及查找结果图如图11所示。
3.2 评估
本文将在指纹通过率和生物特征识别方案的功能点两个维度上与libfprint方案进行对比与评估。
3.2.1通过率对比
指纹通过率测试将在通用的台式机上进行。测试系统的关键参数如表2所示。
表2 测试机的关键参数
指纹通过率的测试分成4个场景,分别从多用户单系统账户手指中心放置、单用户多手指左右偏移放置、单用户单手指旋转放置、单用户单手指随机偏移放置四个方面进行对比。
另外,由于传统的libfprint指纹识别方案最大指纹录入数量为10个指纹,因此在以下场景的libfprint指纹方案的录入步骤中,都是以10个指纹为指纹录入的最大数量。
(1)场景1:单系统账户中心放置
录入方式:两个用户使用同一个系统账户,每个用户以标准姿势(手指放入指纹仪中心,手指与指纹仪夹角为0°)录入右手指纹,共计录入10个指纹。
认证方式:每个人每个手指以标注姿势进行10次认证,共计100次。
场景1进行了3轮测试,测试认证结果如表3所示
表3 单系统账户中心放置测试结果
结论:在手指标准放置情况下,BFS方案与libfprint方案通过率相差不到1%。由于共测试3轮,每轮100次,共计300次,因此1%的差距可以看作测试误差,因此BFS方案和传统libfprint方案在通过率上是一致的。
(2)场景2:单用户多手指左右偏移放置
录入方式:一个用户使用一个系统账户,使用食指和中指录入特征。在libfprint的方案中,每个手指左侧边沿录入2次,右侧边沿录入2次,中心录入1次,共计10次。BFS方案中,每个手指在左侧边沿录入10次,右侧边沿录入10次,中心录入2次,共计22次。
认证方式:每个手指以左侧边沿认证40次,右侧边沿认证40次,标准姿势认证20次,共计100次。
场景2进行了3轮测试,测试认证结果如表4所示:
表4 单用户多手指左右偏移放置测试结果
结论:在手指左右偏移的放置情况下,BFS方案和libfprint方案的通过率都下降了,其中libfprint方案通过率比BFS下降得更多。
(3)场景3:单用户单手指旋转放置
录入方式:一个用户使用一个系统账户,使用食指录入特征。在libfprint方案中,手指分别以-90°、-60°、30°、0°、30°、60°、90°、180°共8个角度录入1次指纹,并且以左侧边沿和右侧边沿录入1次,共计10次。在BFS方案中,食指与libfprint方案一致的角度录入,每个角度录入3次,左右边沿各录入3次,共计30次。
认证方式:食指以-90°、-60°、30°、0°、30°、60°、90°、180°共8个角度认证10次,左右边沿各认证10次,共计100次。
场景3进行了3轮测试,测试认证结果如表5所示。
表5 单用户单手指旋转放置测试结果
结论:在手指旋转放置的情况下,BFS方案和libfprint方案的通过率继续下降,但是BFS方案的通过率和libfprint方案已经拉开差距了,明显BFS方案通过率更高。
(4)场景4:单用户单手指随机偏移放置
录入方式:随机生成手指左右偏移加旋转角度的放置姿势100个,libfprint方案录入前10种姿势,BFS方案录入前30种姿势。
认证方式:使用随机生成的100种姿势进行指纹认证。
场景4进行了3轮测试,测试认证结果如表6所示。
表6 单用户单手指随机偏移放置测试结果
结论:在手指随机方式的情况下,libfprint方案的通过率已经掉到50%以下,相当于用户每认证一次都会遇到一次失败。BFS方案通过率反而比场景3上升了,这是因为指纹传感器的大小是有限的,30种姿势已经能够覆盖绝大部分的姿势了,因此通过率反而比规定几种姿势的情况要好一些。
综合以上场景测试,BFS方案在日常使用过程中,不用刻意要求用户以特定姿势录入指纹和认证指纹,并且在更多的采样下具有更高的通过率。
3.2.2功能点对比
功能点的对比将从支持的生物特征类型、开发及使用接口、存储方式和服务及管理5个大维度,指纹识别、指静脉识别、虹膜识别、声纹识别、人脸识别、统一应用接口、统一驱动接口、统一存储、特征加密、自定义状态、状态通知、设备热插拔通知、特征统一录入及认证、设备争用检测14个小维度进行。对比传统的libfprint指纹识别方案和生物特征识别框架服务(BFS)方案,对比结果如表7所示。
表7 功能点对比
综上可知,生物特征识别框架服务(BFS)与传统的Linux的libfprint方案相比,具备对手指放置姿势不敏感、通过率高、支持生物特征种类多、存储统一且安全、认证服务统一等优点。
4 结论
本文提出并实现了一种基于事件驱动和多种生物特征认证的生物特征识别框架服务,在支持生物特征种类、存储的安全性、使用便捷性、指纹认证通过率等方面具有很大的优势。