在 eMMC 重放保护内存块 (RPMB) 中存储数据需要使用共享密钥。RPMB 读/写操作利用共享密钥生成散列消息认证码 (HMAC)。
显然,RPMB 旨在用于存储高价值数据,例如 DRM 密钥。然而,这似乎呈现出一个经典的“先有鸡还是先有蛋”的场景:保护高价值数据需要安全存储 RPMB 共享密钥。
如果保存共享密钥的前提是可以访问安全存储,那么使用 RPMB 似乎没有意义,因为 DRM 密钥可以直接存储在安全存储中。
RPMB共享密钥该如何存储?
答案1
一种方法是采用 TEE 解决方案的方式来处理。TEE 解决方案本质上声称拥有 RPMB 分区。在初始启动期间(在制造过程中),将派生一个唯一的 RPMB 对称密钥并将其编程到 eMMC/RPMB 设备中。从那时起,在每次后续启动期间,TEE 都能够重新生成共享密钥以便能够与 RPMB 通信。但是,eMMC 几乎始终处于主操作系统(例如 Linux)的控制之下,因此仅对通信消息进行签名通常不足以将数据安全地存储在 RPMB 中。即,消息将通过非安全执行环境发送,因此发送到 RPMB 的数据也必须加密。该加密完全由 TEE 环境本身处理和控制。
编辑:正如 Rohit 和机器人所建议的,这里 [1] 是一个参考,解释了在开源项目 OP-TEE 中是如何做到这一点的,我是该项目的原始作者之一和共同维护者 [2] 之一,已有大约十年了。
[1]https://optee.readthedocs.io/en/latest/architecture/secure_storage.html#rpmb-secure-storage
[2]https://github.com/OP-TEE/optee_os/blob/master/MAINTAINERS#L303
答案2
通常 SoC 具有一些 API/硬件功能来获取设备唯一密钥(通常是派生密钥),以供使用。它们通常在启用安全启动和类似功能时发生变化,因此您可以确保只有运行 SE 的 SoC 才能与 RPMB 通信