16、安全性与隐私:人脸数据存储位置、Android TEE与生物识别、隐私政策合规要求

聊到人脸识别,大家最关心的问题其实就一个:我的脸到底存哪儿了? 会不会被App偷偷上传?会不会被黑客一把薅走?

嗯,这个问题问得好。我当年刚接触Android生物识别时,也一度以为人脸数据是存在某个云端数据库里的。后来踩了几个坑,翻了几遍源码,才真正搞明白——Android的人脸数据,压根儿就不在普通世界里待着。

人脸数据到底存哪儿?

说白了,你的人脸模板(不是照片,是数学特征)是存在设备本地的。而且不是普通的本地存储,是存在一个叫 TEE 的安全环境里。

我习惯把TEE理解成「手机里的保险柜」。普通App、普通系统服务,甚至Root后的超级用户,都拿不到里面的东西。为什么?因为TEE有自己独立的CPU、内存和存储空间,和主系统(REE)是物理隔离的。

关键点:人脸模板永远不会离开TEE。App拿到的只是一个「匹配结果」——是或否,而不是你的脸。

我在项目中遇到过一件事:有个产品经理问我,能不能把人脸数据备份到云端,方便用户换机时直接迁移。我当时就拒绝了——技术上做不到,合规上更不允许。 人脸数据一旦出了TEE,安全模型就崩塌了。

Android TEE 与生物识别的协作流程

Android的生物识别框架,其实是一个分层架构。我画了张图,帮你理清这个流程:

Android 生物识别安全架构 应用层(App) 调用 BiometricPrompt,只获取匹配结果(成功/失败) Android 生物识别框架(BiometricService) 管理认证流程,协调 HAL 与 TEE 通信 硬件抽象层(HAL) 厂商实现,将传感器数据传递给 TEE TEE 安全环境(人脸模板存储 & 匹配)

你看,从App到TEE,中间经过了框架层和HAL层。每一层都只做自己该做的事,人脸模板始终在最底层。App连模板的毛都摸不到。

我曾经踩过的坑:TEE通信超时

有一次我在做人脸解锁的自动化测试,发现偶尔会出现认证失败的情况。查了半天,最后定位到是 TEE 通信超时

原因很简单:TEE是个独立系统,它有自己的调度策略。如果主系统频繁发起认证请求,TEE可能来不及处理,直接返回超时。解决方案是加一个重试机制,并且控制请求频率。

避坑指南:我曾经在代码里写了个死循环不断调 authenticate(),结果把TEE搞崩了,手机直接重启。后来学乖了——每次认证之间至少间隔500ms

隐私政策合规要求

技术搞定了,合规这块也不能马虎。我见过不少App因为隐私政策写得含糊,被下架甚至罚款的。

Android 官方对生物识别数据有明确要求:

  • 必须明确告知用户:人脸数据仅存储在本地,不会上传云端
  • 必须获得用户明确同意:不能默认勾选,不能捆绑在其他权限里
  • 必须提供关闭途径:用户随时可以删除已录入的人脸数据
  • 不得用于其他目的:不能拿人脸数据做用户画像、广告推荐

我习惯在隐私政策里单独开一节,叫「生物识别信息处理说明」。里面写清楚:

1. 收集方式:通过设备摄像头采集人脸图像,仅用于生成数学特征模板
2. 存储位置:模板存储在设备TEE安全环境中,App无法访问
3. 处理目的:仅用于用户身份认证
4. 保留期限:用户删除人脸模板后立即销毁
5. 共享情况:不与任何第三方共享

嗯,这里要注意一点:不要写「可能」「也许」「一般情况下」这种模糊词。合规审查最忌讳的就是模棱两可。

数据删除的「软删除」陷阱

我记得有个项目,用户反馈说「我明明删除了人脸数据,为什么设置里还显示已录入?」

查了一下,原来是开发同学用了「软删除」——只是在数据库里标记了一个删除状态,实际模板还在TEE里。这其实是不合规的。用户要求删除,你就得真删。

正确的做法是调用 BiometricManager.removeBiometric() 或者直接让用户去系统设置里删除。App层面不要自己维护一个「删除标记」。

警告:不要试图缓存或备份人脸模板。哪怕是为了「提升用户体验」也不行。一旦被检测到,轻则下架,重则面临法律风险。

总结一下

人脸数据的安全与隐私,说白了就是三件事:

  1. 存哪儿? TEE里,App拿不到
  2. 怎么用? 只做匹配,不传出去
  3. 合规吗? 说清楚,用户同意,能删除

你想想看,如果每个App都老老实实按这个来,用户还有什么好担心的?可惜现实是,总有人想走捷径。嗯,咱们做技术的,守住底线就好。


公众号:蓝海资料掘金营,微信deep3321