首次启动时,在启动过程的早期阶段会生成并安装用户 0 的密钥。到 init 的 on-post-fs 阶段完成时,Keymaster 必须已做好处理请求的准备。在 Pixel 设备上,这是通过设置一个脚本块处理的,它可确保 Keymaster 在 /data 装载之前启动。
加密政策文件级加密在目录级应用加密政策。首次创建设备的 userdata 分区时,init 脚本会应用基本结构和政策。这些脚本将触发创建首位用户(用户 0)的 CE 密钥和 DE 密钥,并定义要使用这些密钥加密哪些目录。创建其他用户和资料时,会生成必要的其他密钥并将其存储在密钥库中;接下来会为密钥创建凭据和设备存储位置,并且加密政策会将这些密钥关联到相应目录。
在 Android 11 及更高版本中,加密政策不再硬编码到集中位置,而是由 init 脚本中 mkdir 命令的参数定义。使用系统 DE 密钥加密的目录使用 encryption=Require,未加密的目录(或按用户使用密钥加密子目录的目录)使用 encryption=None。
在 Android 10 中,加密政策已硬编码到以下位置:
/system/extras/libfscrypt/fscrypt_init_extensions.cpp在 Android 9 及更早版本中,该位置如下:
/system/extras/ext4_utils/ext4_crypt_init_extensions.cpp可以添加例外情况,以防止某些目录被加密。如果进行了此类修改,设备制造商应添加 SELinux 政策,以便仅向需要使用未加密目录的应用授予访问权限(应排除所有不可信的应用)。
目前已知唯一可接受的使用这种方法的情况是在支持旧版 OTA 功能方面。
在系统应用中支持直接启动 将应用设为直接启动感知型应用为了实现系统应用的快速迁移,新增了两个可在应用级别设置的属性。defaultToDeviceProtectedStorage 属性仅适用于系统应用,directBootAware 属性则适用于所有应用。
<application android:directBootAware="true" android:defaultToDeviceProtectedStorage="true">应用级别的 directBootAware 属性的含义是将相应应用中的所有组件均标记为加密感知型组件。
defaultToDeviceProtectedStorage 属性用于将默认的应用存储位置重定向到 DE 存储空间(而非 CE 存储空间)。使用此标记的系统应用必须仔细审核存储在默认位置的所有数据,并将敏感数据的路径更改为使用 CE 存储空间。使用此选项的设备制造商应仔细检查要存储的数据,以确保其中不含任何个人信息。
在这种模式下运行时,以下系统 API 可在需要时用于明确管理由 CE 存储空间支持的 Context(这些 API 与设备保护存储空间适用的同类 API 相对应)。
Context.createCredentialProtectedStorageContext()
Context.isCredentialProtectedStorage()
支持多位用户多用户环境中的每位用户均会获得单独的加密密钥。每位用户均会获得两个密钥:一个 DE 密钥和一个 CE 密钥。用户 0 由于是特殊用户,因此必须先登录设备。这部分适用于使用设备管理功能的情况。
加密感知型应用按照以下方式在用户间互动:INTERACT_ACROSS_USERS 和 INTERACT_ACROSS_USERS_FULL 允许应用在设备上的所有用户间互动。不过,这些应用只能访问已解锁用户的 CE 加密目录。
应用或许能够在 DE 区域间自由互动,但一位用户已解锁并不意味着设备上的所有用户均已解锁。应用在尝试访问这些区域之前,应先检查解锁状态。
每个工作资料用户 ID 也会获得两个密钥:一个 DE 密钥和一个 CE 密钥。当满足工作挑战时,资料用户会被解锁,并且 Keymaster(在 TEE 中)可以提供资料的 TEE 密钥。
处理更新恢复分区无法访问 userdata 分区中采用 DE 保护的存储空间。强烈建议实现 FBE 的设备支持 A/B 系统更新 OTA 机制。由于可以在正常操作期间安装 OTA 更新,因此恢复分区无需访问已加密存储卷中的数据。
如果使用旧版 OTA 解决方案(该解决方案要求恢复分区访问 userdata 分区中的 OTA 文件),则需要执行以下操作:
在 userdata 分区中创建一个顶级目录(例如“misc_ne”)。
将该顶级目录添加到加密政策例外情况中(请参阅上文中的)。
在顶级目录中创建一个用于存放 OTA 更新包的目录。
添加 SELinux 规则和文件环境,以便控制对该文件夹及其内容的访问。应当只有接收 OTA 更新的进程或应用能够对该文件夹进行读取和写入操作。任何其他应用或进程都不应具有访问该文件夹的权限。
验证为了确保实现的 FBE 功能版本能够按预期工作,首先需要运行多个 CTS 加密测试,例如 DirectBootHostTest 和 EncryptionTest。
如果设备搭载的是 Android 11 或更高版本,请同时运行 vts_kernel_encryption_test:
atest vts_kernel_encryption_test或:
vts-tradefed run vts -m vts_kernel_encryption_test此外,设备制造商还可以执行以下手动测试。在启用了 FBE 的设备上进行以下手动测试:
检查 ro.crypto.state 是否存在
确认 ro.crypto.state 是否已加密
检查 ro.crypto.type 是否存在
确认 ro.crypto.type 是否已设置为 file