此外,测试人员可以在主用户已设置锁定屏幕的情况下启动一个 userdebug 实例。然后通过 adb shell 命令进入设备,并使用 su 获得 root 权限。确认 /data/data 中是否包含加密的文件名;如果没有,则表示存在问题。
我们还建议设备制造商探索如何在其设备或内核上运行。这些测试是 xfstests 文件系统测试套件的一部分。不过,Android 不对这些上游测试提供官方支持。
AOSP 实现详情本部分详细介绍了 AOSP 的文件级加密实现,并讲解了文件级加密的运作方式。设备制造商应该无需执行任何更改,即可在其设备上使用 FBE 和“直接启动”功能。
fscrypt 加密AOSP 实现会用到内核中的“fscrypt”加密(受 ext4 和 f2fs 支持),并通常配置如下:
借助采用 XTS 模式的 AES-256 算法加密文件内容
借助采用 CBC-CTS 模式的 AES-256 算法加密文件名
Adiantum 加密也受到支持。启用 Adiantum 加密后,文件内容和文件名都会使用 Adiantum 进行加密。
如需详细了解 fscrypt,请参阅上游内核文档。
密钥派生文件级加密密钥(512 位密钥)以加密形式存储,通过另一个存放在 TEE 中的密钥(256 位 AES-GCM 密钥)进行加密。如需使用此 TEE 密钥,必须具备以下三项:
身份验证令牌
扩展凭据
secdiscardable hash
身份验证令牌是一个经过加密身份验证的令牌,由Gatekeeper 在用户成功登录时生成。除非用户提供的身份验证令牌正确无误,否则 TEE 将拒绝用户使用该密钥。如果用户没有任何凭据,则不使用也不需要使用身份验证令牌。
扩展凭据是使用 scrypt 算法进行加盐和扩展处理后的用户凭据。实际上,凭据在被传递到 vold(以便传递到 scrypt)之前,会在锁定设置服务中接受一次哈希处理。扩展凭据会以加密形式绑定到 TEE 中的相应密钥,并享有适用于 KM_TAG_APPLICATION_ID 的所有保证。如果用户没有凭据,则不使用也不需要使用扩展凭据。
secdiscardable hash 是 16 KB 随机文件的 512 位哈希,和用于重建相应密钥的其他信息(例如种子)存储在一起。在相应密钥被删除时,该文件会被一并安全删除,或以新的方式加密;采用这种额外的保护措施后,攻击者要恢复相应密钥,必须先恢复这个安全删除的文件中的每一个位。secdiscardable hash 同样会以加密形式绑定到 TEE 中的相应密钥,并享有适用于 的所有保证。
在大多数情况下,FBE 密钥还会在内核中执行额外的密钥派生步骤,以生成实际用于加密的子密钥,例如按文件或按模式生成的密钥。对于第 2 版加密政策,系统会为此使用 HKDF-SHA512。