Android系统是如何保护用户指纹的

2017年11月14日10:21:44 发表评论 11 views

随着智能手机的不断推陈出新,指纹识别功能逐渐成为许多中高端Android手机的标配,google也从android6.0开始对指纹识别进行了官方支持,提供了统一的Android Fingerprint api。但众所周知,Android是一个开放性的系统,其安全性一直以来都受到不少质疑,android app又是可以随意下载安装的。

曾经有开发者提出疑问:现在有了官方的API,如果我在我的app里,在不通知用户的情况下偷偷调用系统API读取指纹模块的数据,不是就能拿到用户的指纹图像吗?回顾前几年的新闻,也能看到类似《某android机指纹识别被破解》的消息。

那么有没有那么容易呢,Android系统是如何保护用户指纹这一极度私密的信息的呢?

其实早在十余年前,ARM就提供了一项名为TrustZone的硬件级的安全解决方案,它将每个芯片内核内的硬件资源和软件资源进行了划分,并将其隔离成两个执行环境: Trust Execution Environment(可信执行环境,简称TEE))和Rich Execution Environment(暂且译为富指令执行环境,简称REE),这两个环境具有独立的运算和存储资源。有高度安全需要的程序被称为Trusted App,运行在TEE中,其他普通程序运行在REE中,并且TEE中的任意资源都不能被REE的组件所访问,从而从硬件上建立了一个强大的隔离机制。下图展示了这两个环境的关系:

Android系统是如何保护用户指纹的

由于android 6.0之前,系统没有统一的指纹识别处理流程,当时提供指纹功能的各手机厂商的方案都是自行实现的,实现方式各异,其安全性也得不到保障,因此屡屡爆出被破解的新闻。Google在统一了Fingerprint API之后,紧接着对所有支持指纹识别的手机厂商提出了要求:

必须有一个硬件支持的密钥库实现,并在可信执行环境(TEE)或带有安全通道的芯片上执行指纹匹配。

必须将所有可识别的指纹数据加密并进行加密认证,使其不能在可信执行环境(TEE)之外获得,读取或更改。

Android系统是如何保护用户指纹的

熟悉Android的用户都听过root这个词,它是指利用操作系统的漏洞获得系统内的最高权限,从而掌控整个设备,进行任意操作。普通的android应用,以及这些应用所基于的linux内核,都是运行在REE环境之上的,而TEE上运行的Trusted App是出厂时经过厂商签名和发布的。Root行为所针对的是linux系统,因此即使设备遭到root,运行在REE内的app也没法访问存放在TEE里面的受保护的程序和数据,从而从硬件上确保了数据安全。

那么指纹识别的整个过程中数据是如何运转的,有没有可能被中途拦截呢?在使用了TrustZone以后,指纹传感器采集的原始图像不会被发送到REE,所有采集到的数据都通过独立的硬件通道,直接送到TEE中。而指纹数据的处理也发生在TEE中,由厂商遵循TEE通信协议所实现的Trusted app来完成。因此,指纹采集、注册和识别的过程都是完全处于TEE中,不会被手机操作系统中的程序所干扰,即便手机经过Root,仍旧无法获取TEE区内的数据资料。

下图是Google统一接口后的指纹识别流程:

Android系统是如何保护用户指纹的

除此之外,google还有以下要求:

只有加密形式的指纹数据可以存储在文件系统中(即使文件系统本身已加密)

指纹模板必须已通过设备专用私钥(例如 AES 密钥)签名,并且必须至少包含绝对文件系统路径、群组和指纹 ID,这样一来,相应模板文件便无法在其他设备上使用,并且无法用于在同一设备上注册的任何其他用户。

在指纹录入以后,指纹图像还需要在TEE中被处理成数字信息,经过提取和加密,最终保存在TEE环境中。在验证指纹时,所有的数据传递、解密及指纹匹配等操作同样发生在TEE中,执行完所有的操作后,才将匹配结果返回给系统的中间层FingerPrintService,也就是REE。正是通过这一系列措施,强化了指纹录入和识别的安全性。

除了指纹识别之外,TrustZone还可以应用在更多的场景,例如 DRM(数字版权管理),移动支付等。不过,特立独行的iPhone虽然使用的也是ARM架构的处理器,但他们的指纹安全方案可没有采用TrustZone。

  • yiisaa
  • 这是我的微信扫一扫
  • weinxin
  • zhengweiqiangcom
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: