Android 加密之文件加密(FBE)

一:加密简介:

加密是使用对称加密密钥对 Android 设备上的所有用户数据进行编码的过程。设备经过加密后,所有由用户创建的数据在存入磁盘之前都会自动加密,并且所有读取操作都会在将数据返回给调用进程之前自动解密数据。加密可确保未经授权方在尝试访问相应数据时无法进行读取。

Android 有两种设备加密方法,即文件级加密和全盘加密。

1全盘加密(FDE):Android 5.0 到 Android 9 支持全盘加密。全盘加密是使用单个密钥(由用户的设备密码加以保护)来保护设备的整个用户数据分区。在启动时,用户必须先提供其凭据,然后才能访问磁盘的任何部分。

虽然这种加密方式非常有利于确保安全性,但这也意味着当重新启动设备时,用户无法立即使用手机的大多数核心功能。由于此单个用户凭据的保护,系统无法访问用户的数据,所以闹钟等功能将无法运行,无障碍服务将无法使用,并且手机也无法接听电话。

2文件级加密(FBE):Android 7.0 及更高版本支持文件级加密。采用文件级加密时,可以使用不同的密钥对不同的文件进行加密,也可以对加密文件单独解密。支持文件级加密的设备还可以支持直接启动。该功能处于启用状态时,已加密设备在启动后将直接进入锁定屏幕,从而可让用户快速使用重要的设备功能,例如无障碍服务和闹钟。

引入文件级加密和可以将应用设为加密感知型应用的 API 后,应用可以在受限环境中运行。这意味着,应用可以在用户提供凭据之前运行,同时系统仍能保护私密用户信息。

3)Android 9 引入了对存在硬件支持的元数据加密的支持。采用元数据加密时,启动时出现的单个密钥会加密未通过 FBE 进行加密的任何内容(例如目录布局、文件大小、权限和创建/修改时间)。该密钥受到 Keymaster 的保护,而 Keymaster 受到启动时验证功能的保护。

二:文件加密介绍FBE:

Android 7.0 及更高版本支持文件级加密 (FBE)。采用文件级加密时,可以使用不同的密钥对不同的文件进行加密,也可以对加密文件单独解密。

注意事项:

1)搭载 Android 10 及更高版本的新设备需要使用文件级加密

2)搭载 Android 9 及更高版本的设备可以同时使用文件级加密和可合并的存储设备。

3)对于搭载 Android 7.0-8.1 的设备,无法同时使用文件级加密和可合并的存储设备。如果在这些设备上启用文件级加密,则必须将新添加的存储媒介(例如 SD 卡)用作传统存储设备

直接启动

借助文件级加密,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 中的所有必要程序包均已更新为直接启动感知型程序包。不过,如果设备制造商使用的是这些应用的定制版本,则需要确保至少存在能够提供以下服务的直接启动感知型程序包:

1)电话服务和拨号器

2)用于在锁定屏幕中输入密码的输入法

示例和来源

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)*

* 使用 defaultToDeviceProtectedStorage 清单属性的系统应用

 

启用文件级加密

如需在设备上启用文件级加密 (FBE),就必须在内部存储设备 (userdata) 上启用 FBE。这也会自动为可合并的存储设备启用 FBE;但是,如有必要,可以覆盖可合并的存储设备的加密格式。内部存储设备通过将 fileencryption=contents_encryption_mode[:filenames_encryption_mode[:flags]] 选项添加到 userdata 的 fstab 行 fs_mgr_flags 列,可启用 FBE。此选项用于定义内部存储设备的加密格式。它最多包含三个以英文冒号分隔的参数:

Android10:ext4 fileencryption=ice,

Android11:f2fs fileencryption=aes-256-xts:

  • contents_encryption_mode 参数指定将哪种加密算法用于加密文件内容,可为 aes-256-xts 或 adiantum。
  • filenames_encryption_mode 参数指定将哪种加密算法用于加密文件名,可为 aes-256-cts、aes-256-heh 或 adiantum。如果不指定,则当 contents_encryption_mode 为 aes-256-xts 时该参数默认为 aes-256-cts,当 contents_encryption_mode 为 adiantum 时该参数默认为 adiantum。
  • Android 11 中新增的 flags 参数是以 + 字符分隔的一个标记列表。支持以下标记:
    • v1 标记用于选择第 1 版加密政策;v2 标记用于选择第 2 版加密政策。第 2 版加密政策使用更安全、更灵活的密钥派生函数。如果设备搭载的是 Android 11 或更高版本(由 ro.product.first_api_level 确定),则默认选择第 2 版;如果设备搭载的是 Android 10 或更低版本,则默认选择第 1 版。
    • inlinecrypt_optimized 标记用于选择针对无法高效处理大量密钥的内嵌加密硬件进行了优化的加密格式。其具体做法是仅为每个 CE 或 DE 密钥派生一个文件内容加密密钥,而不是为每个文件派生一个。IV(初始化向量)的生成也会相应地进行调整。
    • emmc_optimized 标记与 inlinecrypt_optimized 类似,但它还选择了将 IV 限制为 32 位的 IV 生成方法。此标记应仅在符合 JEDEC eMMC v5.2 规范的内嵌加密硬件上使用,因此仅支持 32 位 IV。在其他内嵌加密硬件上,请改用 inlinecrypt_optimized。此标记一律不得在基于 UFS 的存储设备上使用;UFS 规范允许使用 64 位 IV。
    • wrappedkey_v0 标记允许使用硬件封装的密钥。启用该标记后,FBE 密钥就不会由软件生成,而是由 Keymaster 使用 STORAGE_KEY 标签生成。然后,实际向内核提供的每个 FBE 密钥都是从 Keymaster 导出的 STORAGE_KEY 密钥,这会导致每次启动时都使用临时密钥对密钥进行封装。然后,内核会将封装的密钥直接提供给内嵌加密硬件。正确实现后,系统内存中永远不会显示解封的密钥,并且已破解的封装密钥在重新启动后将无法使用。此标记需要硬件支持、对 STORAGE_KEY 的 Keymaster 支持、内核驱动程序支持、inlinecrypt 装载选项以及 inlinecrypt_optimized 标记或 emmc_optimized 标记。

如果不使用内嵌加密硬件,则对于大多数设备推荐设置为 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 或更高版本的设备上,不允许再使用该模式,而必须使用标准加密格式。

设备制造商还可以执行以下手动测试。在启用了 FBE 的设备上进行以下手动测试:

  • 检查 ro.crypto.state 是否存在
    • 确认 ro.crypto.state 是否已加密
  • 检查 ro.crypto.type 是否存在
    • 确认 ro.crypto.type 是否已设置为 file

 

 

    原文作者:都是弯弯绕
    原文地址: https://blog.csdn.net/baidu_40808339/article/details/115225536
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞