安卓全盘加密 数据恢复

FDE (Full disk encryption) 的发展经历了几个阶段: 基于软件/硬件实现的 dm-crypt 基于硬件 GPCE 实现的 request-dm-crypt 基于硬件 ICE 实现的 dm-req-crypt 1. 术语解释 dm-crypt / request-dm-crypt / dm-req-crypt 它们都是位于 linux kernel block

FDE (Full disk encryption) 的发展经历了几个阶段:

  • 基于软件/硬件实现的 dm-crypt
  • 基于硬件 GPCE 实现的 request-dm-crypt
  • 基于硬件 ICE 实现的 dm-req-crypt

1. 术语解释

dm-crypt / request-dm-crypt / dm-req-crypt

它们都是位于 linux kernel block 层, 用于加解密数据的 Device Mapper 驱动模块,下文统称 dm crypt 驱动。Device Mapper 可以将整个 block 设备或 block  设备的部分映射到单个设备。

这些 dm crypt 驱动模块使用这个特性将整个用户数据分区,即用户数据分区中的所有扇区映射到另一个设备,例如/dev/dm-N。此时用户数据分区上的任何操作都由设备映射层处理,dm crypt 驱动模块加密所有写操作,并解密所有的读操作。最终整个加密和解密数据的过程对于用户来说是透明的。

至于这些 dm crypt 驱动模块的区别则是拥有更好的 I/O 性能,主要表现在 I/O 吞吐量和 I/O 延时,下文详细介绍。

GPCE

general-purpose crypto engine,ARM 体系结构提供的通用加密引擎。

ICE

inline crypto engine,一般由 SOC 厂商实现,内嵌到存储器控制器的加密引擎。

2. 基于软件/硬件实现的 dm-crypt

该方案已经被废弃,这里只做简单介绍,架构如下所示:

使用 dm-crypt 加密磁盘:

  • dm-crypt 是在基于 BIO 的设备映射器之上提供的磁盘加密机制,它在物理块设备之上提供虚拟块层。
  • dm 层将接收到的块 I/O (BIO) 克隆并映射到底层物理设备。
  • Android系统中的 VOLD 使用 dm-crypt 将用户数据分区映射到 cryptfs 文件系统。所有对 cryptfs 文件系统的写入都被加密,读取被解密。
  • Android 使用 128 位 AES-CBC 模式以及 ESSIV:SHA256 来加密和解密数据。所有加密材料,例如加密密钥和加密类型,都存储在用户数据分区的底部 16 K 中。
  • dm-crypt 使用 512 字节的数据包大小来加密和解密数据。这意味着必须为每个扇区创建一个新的密码上下文。除此之外,每次为每个扇区生成 IV,即使用 SHA-256 的 512 字节,这是一个昂贵的机制。
  • VOLD 管理所有加密材料并在启动时将其提供给设备映射设备。

基于软件的实现

从安全的角度来看,如果加密操作是在软件中完成的,那么密钥必须存在于软件中,这是不可取的。基于软件的磁盘加密有几个缺点:

  • 它很慢。
  • 所有加密操作都发生在软件中,因此非常耗电且消耗大量电力。
  • 将密钥存储在 RAM 中,可以被转储和搜索,所以并不安全。

基于硬件的实现

由于通用硬件加密引擎不能很好地处理较小的数据包大小,因此仍然存在性能问题。

3. 基于硬件 GPCE 实现的 request-dm-crypt

该方案已经被废弃,这里只做简单介绍,架构如下所示:

相比基于 BIO 的映射器的 dm-crypt, request-dm-crypt 是基于请求的设备映射器,不同之处在于:

  • request-dm-crypt 设备映射器不是克隆和映射 BIO,而是移动到软件架构 stack 中的较低位置,它克隆和映射 I/O 请求。
  • 不需要和 dm-crypt 一样,使用 512 字节的数据包大小来加密和解密数据,大大释放了 GPCE 的性能。

3.1 写操作流程

  1. dm 层调用已注册插件 (request-dm-crypt) 的 map API;
  2. map 函数还会遍历请求中的所有 BIO,并创建所有数据的 SGL(scatter gather list);
  3. 然后 map 函数调用 Kernel Crypto API,该 API 最终调用 GPCE 加密驱动程序以执行加密操作;
  4. 加密完成后,克隆的请求被添加到 I/O 调度程序队列;

3.2 读操作流程

  1. 当块驱动完成读请求时,请求被传递到通用块层(blk_end_bidi_request)以完成请求;
  2. 通用块层通过调用请求的end_io函数来完成请求;
  3. end_io 函数然后调用 request-dm-crypt 的 end_io 函数;
  4. request-dmcrypt end_io 函数遍历请求中的 BIO 并创建一个 SGL。然后该函数使用此列表调用内核加密 API;
  5. Kernel Crypto API 最终调用 GPCE 加密驱动程序来执行解密操作;
  6. 最终将数据返回到文件系统。

使用通用加密引擎 (GPCE) 提供了可以接受的性能量,但由于存储速度不断提高,它还不够。因为 I/O 请求需要通过 request-dm-crypt 处理来执行数据加密和解密,从架构图中可以看出,在原来的 I/O 流程中增加了一个环节增加了延时。因此 FDE 又进化到下文介绍的基于 ICE 实现的 dm-req-crypt。

4. 基于硬件 ICE 实现的 dm-req-crypt

为了克服性能下降,较新的芯片将内联加密引擎 (ICE) 嵌入到存储设备中。基于 ICE 的 FDE 在 ICE 硬件中执行所有加密操作,而无需返回软件。该解决方案提供几乎线速的吞吐量,即加密设备上的 I/O 吞吐量不会降低

 FDE Architecture
知秋君
上一篇 2024-07-04 12:48
下一篇 2024-07-04 12:12

相关推荐