Android 7.0 及更高版本支持文件级加密 (FBE)。采用文件级加密时,可以使用不同的密钥对不同的文件进行加密,也可以对加密文件单独解密。
本文介绍了如何在新设备上启用文件级加密,以及系统应用如何利用 Direct Boot API 尽可能为用户提供最佳、最安全的体验。
注意:
直接启动借助文件级加密,Android 7.0 中引入了一项称为直接启动的新功能。该功能处于启用状态时,已加密设备在启动后将直接进入锁定屏幕。之前,在使用全盘加密 (FDE) 的已加密设备上,用户在访问任何数据之前都需要先提供凭据,以致于手机只能执行最基本的操作。例如,手机甚至无法接听电话,只能执行基本的紧急拨号操作,而且闹钟无法运行,无障碍服务也不可用。
引入文件级加密 (FBE) 和可以将应用设置为加密感知型应用的新 API 后,这些应用将能够在受限环境中运行。这意味着,应用可以在用户提供凭据之前运行,同时系统仍能保护私密用户信息。
在启用了 FBE 的设备上,每位用户均有两个可供应用使用的存储位置:
凭据加密 (CE) 存储空间,这是默认存储位置,仅在用户解锁设备后可用。
设备加密 (DE) 存储空间,该存储位置在直接启动模式下和用户解锁设备后均可使用。
这种区分能够使工作资料更加安全,因为这样一来,加密不再只基于启动密码,从而能够同时保护多位用户。
Direct Boot API 允许加密感知型应用访问上述任何一个存储空间。应用生命周期会发生一些变化,以便系统在以下情况下通知应用:用户的 CE 存储空间因用户在锁定屏幕上首次输入凭据而解锁时,或者在工作资料提供时。无论是否实现了 FBE,搭载 Android 7.0 的设备都必须支持这些新的 API 和生命周期。不过,如果没有启用 FBE,DE 和 CE 存储空间将始终处于解锁状态。
Android 开源项目 (AOSP) 中提供了 Ext4 和 F2FS 文件系统中的文件级加密的完整实现。在满足相关要求的设备上,只需启用该实现即可使用该功能。选择使用 FBE 的制造商可能想要了解基于所用系统芯片 (SoC) 优化该功能的方法。
AOSP 中的所有必要程序包均已更新为直接启动感知型程序包。不过,如果设备制造商使用的是这些应用的定制版本,则需要确保至少存在能够提供以下服务的直接启动感知型程序包:
电话服务和拨号器
用于在锁定屏幕中输入密码的输入法
示例和源代码Android 提供了文件级加密的参考实现,其中 vold (system/vold) 负责提供用于管理 Android 上的存储设备和存储卷的功能。添加 FBE 会为 vold 提供一些新命令,以便支持对多位用户的 CE 密钥和 DE 密钥进行密钥管理。除了为使用内核中的功能而进行的核心更改外,许多系统程序包(包括锁定屏幕和 SystemUI)也经过了修改,以支持 FBE 和“直接启动”功能。这些选项包括:
AOSP 拨号器 (packages/apps/Dialer)
桌面时钟 (packages/apps/DeskClock)
LatinIME (packages/inputmethods/LatinIME)*
“设置”应用 (packages/apps/Settings)*
SystemUI (frameworks/base/packages/SystemUI)*
* 使用 清单属性的系统应用
通过在 AOSP 源代码树的框架或程序包目录中运行 mangrep directBootAware 命令,可以找到更多加密感知型应用和服务的示例。
依赖关系为了安全地使用 AOSP 的 FBE 实现,设备需要满足以下依赖关系:
注意:存储政策会应用到文件夹及其所有子文件夹。对于以未加密形式存入 OTA 文件夹以及存入系统解密密钥存放文件夹的内容,制造商应加以限制。大多数内容都应存放在凭据加密存储空间(而非设备加密存储空间)内。
实现最重要的一点是,应根据直接启动开发者文档将诸如闹钟、电话、无障碍功能等应用设为 android:directBootAware。
内核支持Android 通用内核 3.18 及更高版本中提供对 Ext4 和 F2FS 加密的内核支持。如需在 5.1 版或更高版本的内核中启用此功能,请使用以下命令行:
CONFIG_FS_ENCRYPTION=y对于较旧的内核,如果设备的 userdata 文件系统为 Ext4,则使用 CONFIG_EXT4_ENCRYPTION=y;如果设备的 userdata 文件系统为 F2FS,则使用 CONFIG_F2FS_FS_ENCRYPTION=y。
如果您的设备支持可合并的存储设备或者将对内部存储设备使用元数据加密,还要启用元数据加密所需的内核配置选项(如元数据加密文档中所述)。
除了对 Ext4 或 F2FS 加密提供功能支持之外,设备制造商还应启用加密加速,以便加快文件级加密的速度并改善用户体验。例如,在 ARM64 设备上,可以通过设置以下内核配置选项来启用 ARMv8 CE(加密扩展)加速:
CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_CRYPTO_SHA2_ARM64_CE=y