Android 开源项目(2)

为了进一步提高性能并降低能耗,设备制造商还可以考虑实现内嵌加密硬件,用于在数据往返于存储设备的途中对数据进行加密/解密。Android 通用内核(4.14 版及更高版本)包含一个框架,允许在提供硬件和供应商驱动程序支持的情况下使用内嵌加密。可以通过设置以下内核配置选项来启用内嵌加密框架:

CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y

如果您的设备使用基于 UFS 的存储设备,则还应启用:

CONFIG_SCSI_UFS_CRYPTO=y

如果您的设备使用基于 eMMC 的存储设备,则还应启用:

CONFIG_MMC_CRYPTO=y 启用文件级加密

如需在设备上启用文件级加密 (FBE),就必须在内部存储设备 (userdata) 上启用 FBE。这也会自动为可合并的存储设备启用 FBE;但是,如有必要,可以覆盖可合并的存储设备的加密格式。

内部存储设备

通过将 fileencryption=contents_encryption_mode[:filenames_encryption_mode[:flags]] 选项添加到 userdata 的 fstab 行 fs_mgr_flags 列,可启用 FBE。此选项用于定义内部存储设备的加密格式。它最多包含三个以英文冒号分隔的参数:

如果不使用内嵌加密硬件,则对于大多数设备推荐设置为 fileencryption=aes-256-xts。如果使用内嵌加密硬件,则对于大多数设备推荐设置为 fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized。在没有采用任何形式的 AES 加速的设备上,可以设置 fileencryption=adiantum,从而用 Adiantum代替 AES。

在搭载 Android 10 或更低版本的设备上,也可以使用 fileencryption=ice 来指定使用 FSCRYPT_MODE_PRIVATE 文件内容加密模式。Android 通用内核未实现该模式,但供应商可使用自定义内核补丁程序实现该模式。该模式生成的磁盘格式因供应商而异。在搭载 Android 11 或更高版本的设备上,不允许再使用该模式,而必须使用标准加密格式。

注意:由于 fileencryption 选项指定了磁盘格式,因此无法通过 OTA 进行更改。

默认情况下,使用 Linux 内核的加密 API 完成文件内容加密。如果想改用内嵌加密硬件,也请添加 inlinecrypt 装载选项。例如,完整的 fstab 行可能如下所示:

/dev/block/by-name/userdata /data f2fs nodev,noatime,nosuid,errors=panic,inlinecrypt wait,fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized

注意

inlinecrypt 和 fileencryption 选项位于不同的列中,因为 inlinecrypt 是文件系统装载选项,而 fileencryption 是 Android 用户空间的标记。

如果您的内嵌加密硬件正常工作且未设置 wrappedkey_v0 标记,则可以随时添加或移除 inlinecrypt 装载选项,而无需擦除设备。换句话说,除非启用了硬件封装的密钥,否则 inlinecrypt 只会影响实现,不会影响磁盘格式。应该在开发过程中对移除 inlinecrypt 进行测试,以验证您的内嵌加密硬件是否正常工作。

可合并的存储设备

从 Android 9 开始,FBE 和 可合并的存储设备可以一起使用。

为 userdata 指定 fileencryption fstab 选项也会自动为可合并的存储设备启用 FBE 和元数据加密。但是,可以通过设置 PRODUCT_PROPERTY_OVERRIDES 中的属性来覆盖可合并的存储设备上的 FBE 和/或元数据加密格式。

在搭载 Android 11 或更高版本的设备上,请使用以下属性:

ro.crypto.volume.options(Android 11 中新增的属性),用于为可合并的存储设备选择 FBE 加密格式。其语法与 fileencryption fstab 选项的参数相同,并且使用相同的默认值。请参阅上文关于 fileencryption 的建议,了解此处应使用什么设置。

ro.crypto.volume.metadata.encryption 用于为可合并的存储设备选择元数据加密格式。请参阅。

在搭载 Android 10 或更低版本的设备上,请使用以下属性:

ro.crypto.volume.contents_mode,用于选择内容加密模式。这相当于 ro.crypto.volume.options 的第一个以英文冒号分隔的字段。

ro.crypto.volume.filenames_mode,用于选择文件名加密模式。这相当于 ro.crypto.volume.options 的第二个以英文冒号分隔的字段,但在搭载 Android 10 或更低版本的设备上默认设置为 aes-256-heh。在大多数设备上,需要将其明确替换为 aes-256-cts。

ro.crypto.fde_algorithm 和 ro.crypto.fde_sector_size 用于为可合并的存储设备选择元数据加密格式。请参阅。

注意:在搭载 Android 10 或更低版本的设备上,可合并的存储设备上的默认文件名加密模式对于大多数设备都无效,并且与内部存储设备上的默认模式不同。因此,在此类设备上必须明确进行替换,通常替换为 aes-256-cts。

与 Keymaster 集成

vold 负责处理密钥生成和内核密匙环管理。AOSP 的 FBE 实现要求设备支持 1.0 或更高版本的 Keymaster HAL。更低版本的 Keymaster HAL 不受支持。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/e0d2747ccf30d166c0651a9274740f26.html