生成 keyctl add trusted -> 明文密钥在内核态 -> CAAM 加密 -> Blob 落盘(密文)
导入 caam-keygen import -> 读取 Blob(密文) -> CAAM 解密(内核态) -> 存入内核密钥环 -> 应用引用 ID
使用 cryptsetup --key-description -> 内核态读取 trusted 密钥 -> 传递给 dm-crypt -> 加密/解密设备
"密钥不落盘"的核心保证:明文密钥永不写入持久存储
在以下三个关键场景中,明文密钥(即用于加解密的原始字节)始终保持在 内核内存(RAM) 或 CAAM 硬件内部 ,绝不会被写入 Flash、eMMC、SD 卡或任何磁盘文件 。用户态应用程序也无法通过任何系统调用读取到明文内容。
1. 生成 trusted 密钥:keyctl add trusted mykey "new 32" @u
-
明文密钥 :由 CAAM 硬件内部生成随机数,永不暴露给 CPU,直接存储在 CAAM 的安全寄存器中(相当于硬件内部"黑盒")。
-
内核态 :仅拥有一个 密钥 ID (例如
190558042),该 ID 指向内核密钥环中的一个trusted类型对象,该对象记录的是密钥的 Blob(密文),而非明文。 -
落盘检查 :无任何明文写入磁盘。内核密钥环是易失性内存,关机即清空。
2. 使用密钥(如 cryptsetup --key-description)
-
流程:
-
cryptsetup将描述符"trusted:mykey"传递给内核。 -
内核在密钥环中找到对应的 ID,直接从 CAAM 硬件中引用该密钥(CAAM 内部解密 Blob 得到明文,但仅在硬件内部使用)。
-
解密后的明文密钥直接通过内核内部的
dm-crypt模块用于磁盘 I/O 加解密,全程不经过用户态内存。
-
-
落盘检查:
-
磁盘 :解密过程中,明文密钥仅存在于内核的临时缓冲区,从不写入任何存储设备。
-
用户态 :
cryptsetup进程本身从未获得密钥明文,因此也无法将其保存到文件。
-
3. 从 Blob 恢复密钥:caam-keygen import my_key.bb my_key
-
输入 :
my_key.bb是 密文文件,存储在磁盘上(可以落盘,因为它是密文)。 -
处理:
-
工具读取
my_key.bb(密文)并传递给 CAAM 硬件。 -
CAAM 在硬件内部解密,得到明文密钥。
-
明文密钥被加载到内核密钥环中(类型为
logon),以密文形式存储(但密钥环内部保存的是 Blob 或黑密钥格式,明文仅存在于 CAAM 内部或临时内核缓冲区)。
-
-
落盘检查:
-
my_key.bb(密文)可以安全存储在磁盘上,因为它是加密的,即使泄露也无害。 -
明文密钥 :仅在 CAAM 硬件内部或内核内存中短暂存在,从未写入任何文件。
-
总结:明文密钥的生命周期
| 阶段 | 明文密钥所处位置 | 是否落盘(写入持久存储) |
|---|---|---|
生成 (keyctl add trusted) |
CAAM 硬件内部 / 内核密钥环(以 Blob 形式) | ❌ 不落盘 |
使用 (cryptsetup / AF_ALG) |
内核态临时缓冲区(加解密时) | ❌ 不落盘 |
从 Blob 恢复 (caam-keygen import) |
CAAM 内部 → 内核密钥环(Blob 形式) | ❌ 不落盘(仅密文 Blob 文件落盘) |
结论 :在整个过程中,明文密钥从不以任何形式出现在磁盘、Flash、SD 卡或任何非易失性存储介质上 ,从而实现了"密钥不落盘"。用户态工具(如 cryptsetup)仅持有描述符,无权接触明文,因此即使系统被攻破,攻击者也无法从存储中提取密钥明文。
2. 详细流程对比
场景 A:导入 Blob(caam-keygen import)
-
背景 :你之前用
caam-keygen create生成了一个 Blob 文件(my_key.bb),它是一个被 CAAM 硬件用芯片唯一密钥加密过的密文包。现在系统重启了,你需要把那个密钥找回来。 -
流程:
-
读取磁盘上的
my_key.bb(密文)。 -
发送给 CAAM 硬件,请求解封(Unseal)。
-
CAAM 在硬件内部解密,得到明文密钥。
-
将明文密钥加载到内核密钥环(通常类型为
logon),生成一个新的密钥 ID。 -
此后,应用可以通过该 ID 引用此密钥。
-
-
结果 :密钥从"离线密文"变为"在线密钥"。这是"不落盘"的恢复过程。
场景 B:使用密钥(cryptsetup --key-description)
-
背景 :你已经有一个在内核密钥环中活跃的
trusted密钥(例如之前用keyctl add trusted生成的)。现在你要用它来解密一个磁盘分区。 -
流程:
-
cryptsetup将描述符"trusted:my_trusted_key"传递给内核。 -
内核在密钥环中找到该密钥的 ID(它已经在内存中)。
-
直接引用该密钥 (无需再次解密 Blob),传递给
dm-crypt模块。 -
dm-crypt使用该密钥对/dev/loop1进行加解密操作。
-
-
结果 :密钥被"使用"于实际数据加密。这是"不落盘"的应用过程。
-
解构用户的请求:
-
询问
trusted.ko的作用。 -
询问
keyctl命令的作用。 -
询问
keyctl list @u的含义。 -
询问
cryptsetup open --type plain --key-description "trusted:my_trusted_key" /dev/loop1 test_enc命令的作用。 -
询问
caam-keygen create my_key ecb -s 32 -p和caam-keygen import my_key.bb my_key命令的作用,特别是导入的密钥存储在哪里。
-
-
分析每个组件:
-
trusted.ko:这是一个 Linux 内核模块,实现了"trusted"密钥类型。它利用硬件安全模块(在我们的例子中是 CAAM)来密封/封装密钥。密钥材料以加密形式(Blob)存储,解密(解封)只能由硬件在可信执行环境/内核空间内完成。用户空间永远看不到明文。 -
keyctl:这是一个用户空间实用程序,用于与内核密钥环设施(keyrings facility)交互。它允许添加、删除、列出、修改密钥和密钥环。 -
keyctl list @u:keyctl list列出密钥环的内容。@u是当前进程的"用户密钥环"(特定于用户的密钥环)的特殊引用。所以这条命令的意思是"列出当前用户密钥环中的所有密钥"。 -
cryptsetup open ... --key-description "trusted:my_trusted_key" ...:这个命令使用 dm-crypt 打开一个加密设备。--key-description告诉 cryptsetup 不要从文件或密码提示获取密钥材料,而是去内核密钥环中查找具有该描述(trusted:my_trusted_key)的密钥。然后它使用该密钥(由 CAAM 硬件保护)来解密磁盘。 -
caam-keygen create和import:-
create:生成一个随机密钥,用 CAAM 的 OTPMK/测试密钥将其封装成一个 Blob,并将 Blob(.bb文件)和黑密钥(my_key文件)写入磁盘。 -
import:读取 Blob(.bb文件),将其发送到 CAAM 硬件进行解封,然后将解封后的密钥加载到内核密钥环中。 -
导入的密钥存储在哪里? :它存储在内核密钥环 中(具体来说,作为一个
logon类型的密钥,因为它用于 dm-crypt)。它不 永久存储在磁盘上(除了作为 Blob 的加密形式)。明文密钥材料安全地驻留在内核内存中,由 CAAM 硬件保护(通常也在 CAAM 的安全内存中,或仅由内核维护)。具体来说,caam-keygen import通常将其加载到user或session密钥环中,但更准确地说,作为logon类型添加(因为dm-crypt需要logon或trusted)。我会澄清,从物理上来说,明文保存在内核内存中,而 Blob 保存在磁盘上。
-
-
-
构建回答结构:
-
简介:简明扼要地回答每个部分。
-
详细解释第 1 点:
trusted.ko。 -
详细解释第 2 点:
keyctl和list @u。 -
详细解释第 3 点:
cryptsetup命令。 -
详细解释第 4 点:
caam-keygen命令以及"存储在哪里"的问题(密钥环 vs 磁盘 Blob vs 内核内存)。 -
总结:简要总结数据流。
-
-
起草内容(头脑中/草稿):
-
trusted.ko:位于security/keys/trusted-keys/。注册trusted密钥类型。处理"密封"(创建 Blob)和"解封"(加载 Blob)。 -
keyctl:控制内核密钥环的瑞士军刀。 -
@u:KEY_SPEC_USER_KEYRING。进程特定的用户密钥环。 -
cryptsetup ...:指示dm-crypt目标获取密钥材料,不是从stdin或文件,而是直接从内核密钥环(trusted:my_trusted_key)获取,这样用户空间永远无法访问它。 -
caam-keygen create:将明文密钥(或随机生成)转换为.bb(Blob = 密文)和.key(黑密钥格式)。 -
caam-keygen import:读取.bb-> CAAM 解密 -> 加载到内核密钥环。存储在内核密钥环中(通常是logon类型,但有时是user)。关键在于:解密后的密钥只在 RAM 中,并且绑定到内核的密钥环子系统。
-
-
优化"存储位置":
-
物理上:Blob(
.bb)存储在用户空间文件系统中(磁盘/Flash)。 -
逻辑上/安全上:导入后,明文密钥被存储在内核的密钥环 中(具体是作为
logon密钥类型,因为它用于 dm-crypt)。它在/proc/keys中可见,但用户空间无法读取实际字节(除非密钥类型允许,而logon和trusted禁止读回)。所以回答:明文密钥存储在内核内存(密钥环) 中,加密的 Blob 存储在磁盘文件中。
-
-
起草最终回复 :(起草时将内容综合成清晰、有条理、详细的解释)。确保为每个问题添加标题。确保准确地解释关于
keyctl list @u的内容(列出用户密钥环)。 -
检查草稿 :
trusted.ko确实处理密封/解封。keyctl确实管理密钥环。cryptsetup使用密钥环密钥。caam-keygen将导入的密钥(解封后)放入内核密钥环。我会明确写出命令的确切流程。
以下是针对你提出的每个问题的详细解释:
1. trusted.ko 的作用
trusted.ko 是 Linux 内核中的一个模块(位于 security/keys/trusted-keys/),它实现了一种名为 trusted 的内核密钥类型。
-
核心功能:它充当用户空间与硬件安全模块(如 TPM 或 CAAM)之间的桥梁。
-
在 i.MX 8M Plus 上的具体工作 :当 CAAM 驱动启用后,
trusted.ko会调用 CAAM 硬件接口,负责将密钥数据封装(Seal)成 Blob 或从 Blob 解封(Unseal)出明文密钥。 -
安全特性 :它确保密钥的"明文"永远不离开内核空间 。用户态程序(如
keyctl)只能引用该密钥的 ID,而无法读取其实际的字节内容。
2. keyctl 命令的作用
keyctl 是 Linux 内核密钥环(Keyring)设施的用户空间管理工具。它是用户态程序与内核密钥管理子系统交互的"瑞士军刀"。
-
核心能力:
-
添加 :向内核密钥环添加密钥(
add)。 -
列出 :查看特定密钥环中的密钥列表(
list)。 -
清除:删除密钥或密钥环。
-
描述:查看密钥的元数据(权限、类型、描述)。
-
链接 :将密钥从一个密钥环链接到另一个(
link)。
-
-
安全作用:借助它,应用程序无需在内存或磁盘中存储密钥明文,只需告诉内核"使用 ID 为 X 的密钥帮我加密",从而支持"不落盘"。
3. keyctl list @u 是什么意思
-
list:列出指定密钥环中的所有密钥。 -
@u:这是一个特殊标识符 ,指代当前进程的 User Keyring(用户密钥环)。- 每个登录用户都有一个持久的用户密钥环,主要用于存储该用户特定的持久化密钥。
-
完整含义 :查看当前用户密钥环中存储了哪些密钥。例如,当你执行
keyctl add trusted my_trusted_key "new 32" @u后,该密钥就会出现在这个列表中,你可以通过此命令看到它的 ID、类型(trusted)和描述(my_trusted_key)。
4. cryptsetup open --type plain --key-description "trusted:my_trusted_key" /dev/loop1 test_enc的作用
这个命令用于打开(解密)一个加密的块设备 ,但与传统方式不同,它不使用密码或密钥文件 ,而是直接引用内核密钥环中的 CAAM 硬件密钥。
-
流程拆解:
-
--type plain:使用最简单的磁盘加密格式(无 LUKS 头部)。 -
--key-description "trusted:my_trusted_key":告诉cryptsetup,去内核密钥环查找描述为my_trusted_key、类型为trusted的密钥,并将其作为解密密钥。 -
/dev/loop1:要解密的设备。 -
test_enc:解密后映射出的设备名(即/dev/mapper/test_enc)。
-
-
安全意义 :密钥明文在从 CAAM 硬件到
dm-crypt内核模块的传输过程中完全在内核态完成,用户态(cryptsetup)全程没有接触到密钥明文,完美实现了"不落盘"和"不露明"。
5. caam-keygen create 与 import 的作用,以及导入的密钥存储在哪里?
caam-keygen create my_key ecb -s 32 -p
-
作用 :生成一个 CAAM Blob(安全数据块)。
-
生成一个 32 字节的随机 AES 密钥。
-
调用 CAAM 硬件,用**当前设备的唯一密钥(OTPMK 或测试密钥)**将该随机密钥加密成一个二进制密文包。
-
输出两个文件:
-
my_key.bb:Blob 文件(密文)。可以公开存储在 Flash 或文件系统中,即使被复制也无法在其他芯片上解密。 -
my_key(或黑密钥文件):黑密钥的原始格式(通常包含头部和密文)。
-
-
caam-keygen import my_key.bb my_key
-
作用:将之前生成的 Blob 文件导入内核,恢复为可用的密钥。
-
读取
my_key.bb中的密文数据。 -
发送给 CAAM 硬件进行解密(解封)。
-
将解密后的明文密钥加载到内核密钥环中,并生成一个密钥 ID。
-
导入的密钥存储在了哪里?
这个问题需要分两层看:
-
物理存储位置(持久化):
-
明文密钥 :绝不落盘,仅存在于内核内存中(RAM),掉电即失。
-
密文 Blob :存储在磁盘上(即你指定的文件
my_key.bb中)。它是硬件绑定的密文,即使别人拿到这个文件,没有你的芯片也无法解密。
-
-
逻辑存储位置(运行时的归属):
-
当执行
caam-keygen import后,该密钥会被添加到内核密钥环中,具体通常为logon类型 的密钥(因为dm-crypt支持这种类型)。 -
你可以通过
keyctl list @u或keyctl list @s看到它(例如logon: my_key)。 -
该密钥会一直驻留在内核密钥环中,直到系统关机、重启,或主动使用
keyctl unlink或keyctl revoke移除它。
-
总结:数据流向图
text
[生成] keyctl add trusted -> 明文密钥在内核态 -> CAAM 加密 -> Blob 落盘(密文)
[使用] cryptsetup --key-description -> 内核态读取 trusted 密钥 -> 传递给 dm-crypt -> 加密/解密设备
[导入] caam-keygen import -> 读取 Blob(密文) -> CAAM 解密(内核态) -> 存入内核密钥环 -> 应用引用 ID
本回答由 AI 生成,内容仅供参考,请仔细甄别
生成 keyctl add trusted -> 明文密钥在内核态 -> CAAM 加密 -> Blob 落盘(密文) 使用 cryptsetup --key-description -> 内核态读取 trusted 密钥 -> 传递给 dm-crypt -> 加密/解密设备 导入 caam-keygen import -> 读取 Blob(密文) -> CAAM 解密(内核态) -> 存入内核密钥环 -> 应用引用 ID 在里面解释是如何不落盘的
我们被问到如何解释"不落盘"的过程,基于前面的描述。用户希望我们在已有的流程中解释"不落盘"的关键点。我们需要明确指出来,明文密钥在任何步骤都不写入持久存储(磁盘或Flash),只存在于内核内存或硬件内部,且用户态无法读取。
我们需要在流程图中或文字里突出"明文密钥永不落盘"的机制。用户可能想要一个清晰的说明。我们可以在回答中加入对每个步骤中密钥状态的说明,强调明文不离开内核态,且不会被写入存储设备。
另外,用户可能希望我们结合前面的解释,给出更详细的说明。我们需要提供清晰的解释,可能分成几步,指出每个环节中密钥明文的存放位置。
此外,用户可能会问"落盘"是指什么,我们可以定义为写入任何持久性存储介质(如eMMC、SD卡、NAND Flash、硬盘等)。我们要强调明文密钥只在易失性内存(RAM)中短暂存在,且只有内核能够访问。
我们将提供一个结构化的回答,从生成、使用、导入三个场景解释明文密钥的去向,并明确指出"不落盘"的保证点。
我们还可以提一下,即使设备重启,密钥消失,因此需要重新生成或从Blob恢复,但恢复时Blob是密文,解密后明文仍只在内核内存,不写盘。
最终给出一个清晰的结论。
"密钥不落盘"的核心保证:明文密钥永不写入持久存储
在以下三个关键场景中,明文密钥(即用于加解密的原始字节)始终保持在 内核内存(RAM) 或 CAAM 硬件内部 ,绝不会被写入 Flash、eMMC、SD 卡或任何磁盘文件 。用户态应用程序也无法通过任何系统调用读取到明文内容。
1. 生成 trusted 密钥:keyctl add trusted mykey "new 32" @u
-
明文密钥 :由 CAAM 硬件内部生成随机数,永不暴露给 CPU,直接存储在 CAAM 的安全寄存器中(相当于硬件内部"黑盒")。
-
内核态 :仅拥有一个 密钥 ID (例如
190558042),该 ID 指向内核密钥环中的一个trusted类型对象,该对象记录的是密钥的 Blob(密文),而非明文。 -
落盘检查 :无任何明文写入磁盘。内核密钥环是易失性内存,关机即清空。
2. 使用密钥(如 cryptsetup --key-description)
-
流程:
-
cryptsetup将描述符"trusted:mykey"传递给内核。 -
内核在密钥环中找到对应的 ID,直接从 CAAM 硬件中引用该密钥(CAAM 内部解密 Blob 得到明文,但仅在硬件内部使用)。
-
解密后的明文密钥直接通过内核内部的
dm-crypt模块用于磁盘 I/O 加解密,全程不经过用户态内存。
-
-
落盘检查:
-
磁盘 :解密过程中,明文密钥仅存在于内核的临时缓冲区,从不写入任何存储设备。
-
用户态 :
cryptsetup进程本身从未获得密钥明文,因此也无法将其保存到文件。
-
3. 从 Blob 恢复密钥:caam-keygen import my_key.bb my_key
-
输入 :
my_key.bb是 密文文件,存储在磁盘上(可以落盘,因为它是密文)。 -
处理:
-
工具读取
my_key.bb(密文)并传递给 CAAM 硬件。 -
CAAM 在硬件内部解密,得到明文密钥。
-
明文密钥被加载到内核密钥环中(类型为
logon),以密文形式存储(但密钥环内部保存的是 Blob 或黑密钥格式,明文仅存在于 CAAM 内部或临时内核缓冲区)。
-
-
落盘检查:
-
my_key.bb(密文)可以安全存储在磁盘上,因为它是加密的,即使泄露也无害。 -
明文密钥 :仅在 CAAM 硬件内部或内核内存中短暂存在,从未写入任何文件。
-
总结:明文密钥的生命周期
| 阶段 | 明文密钥所处位置 | 是否落盘(写入持久存储) |
|---|---|---|
生成 (keyctl add trusted) |
CAAM 硬件内部 / 内核密钥环(以 Blob 形式) | ❌ 不落盘 |
使用 (cryptsetup / AF_ALG) |
内核态临时缓冲区(加解密时) | ❌ 不落盘 |
从 Blob 恢复 (caam-keygen import) |
CAAM 内部 → 内核密钥环(Blob 形式) | ❌ 不落盘(仅密文 Blob 文件落盘) |
结论 :在整个过程中,明文密钥从不以任何形式出现在磁盘、Flash、SD 卡或任何非易失性存储介质上 ,从而实现了"密钥不落盘"。用户态工具(如 cryptsetup)仅持有描述符,无权接触明文,因此即使系统被攻破,攻击者也无法从存储中提取密钥明文。
本回答由 AI 生成,内容仅供参考,请仔细甄别
也就是keyctl add trusted my_trusted_key "new 32" @u生成一个密钥,然后通过CAAM加密生成加密后的数据块文件,通过cryptsetup命令内核解密,caam-keygen import也是读取blob到caam解密 使用 cryptsetup --key-description -> 内核态读取 trusted 密钥 -> 传递给 dm-crypt -> 加密/解密设备 导入 caam-keygen import -> 读取 Blob(密文) -> CAAM 解密(内核态) -> 存入内核密钥环 -> 应用引用 ID 使用哦和导入两个解密的区别?
好的,用户对"使用"和"导入"这两个解密过程的区别感到困惑。从对话历史来看,我们一直在围绕CAAM功能进行搭建和问题排查,用户现在提出了一个非常具体的技术细节问题。
嗯,用户已经理解了基本的"密钥不落盘"概念,但可能不清楚"使用"和"导入"在技术实现上的本质不同。深层需求可能是想理解这两个操作在安全性、应用场景和最终效果上的差异,以便在实际开发中做出正确的选择。
回顾之前的交流,我解释了trusted.ko、keyctl、cryptsetup和caam-keygen等工具的作用。现在用户把这两个流程并列对比,说明ta需要更清晰的概念区分。
我需要从核心原理入手:导入是将持久化的Blob恢复为运行时的密钥ID,而使用是直接用已有的密钥ID去执行加解密操作。重点要解释清楚它们在数据流、硬件交互和用户态暴露程度上的不同。
想到可以用一个比喻来帮助理解,比如保险箱和自动门的钥匙。导入像把钥匙从保险箱拿出来,而使用像直接刷卡开门。这样用户可能更容易把握本质区别。
最后要强调,虽然过程不同,但最终都实现了"明文密钥不落盘"这个核心目标,这是CAAM安全模型的关键。
这是一个非常好的问题!这两个过程虽然都涉及 CAAM 解密,但目标、输入和结果完全不同。让我详细解释它们的区别:
1. 核心区别总结
| 对比维度 | 导入 Blob (caam-keygen import) |
使用密钥 (cryptsetup --key-description) |
|---|---|---|
| 目标 | 将持久化的密文 Blob 恢复为内核可用的密钥 | 将已有的内核密钥用于实际加密操作(如磁盘加密) |
| 输入 | Blob 文件(磁盘上的密文) | 密钥描述符(如 "trusted:mykey") |
| 解密位置 | CAAM 硬件内部(解封 Blob → 明文密钥) | 内核密钥环直接引用已存在的密钥(无需再次解密) |
| 输出 | 在内核密钥环中创建一个新的密钥 ID | 直接进行磁盘 I/O 加解密,不产生新密钥 |
| 触发时机 | 开机或需要恢复持久化密钥时 | 每次需要加密/解密数据时 |
| 用户态接触明文 | ❌ 否(明文仅在内核态) | ❌ 否(明文仅在内核态/硬件内部) |
2. 详细流程对比
场景 A:导入 Blob(caam-keygen import)
-
背景 :你之前用
caam-keygen create生成了一个 Blob 文件(my_key.bb),它是一个被 CAAM 硬件用芯片唯一密钥加密过的密文包。现在系统重启了,你需要把那个密钥找回来。 -
流程:
-
读取磁盘上的
my_key.bb(密文)。 -
发送给 CAAM 硬件,请求解封(Unseal)。
-
CAAM 在硬件内部解密,得到明文密钥。
-
将明文密钥加载到内核密钥环(通常类型为
logon),生成一个新的密钥 ID。 -
此后,应用可以通过该 ID 引用此密钥。
-
-
结果 :密钥从"离线密文"变为"在线密钥"。这是"不落盘"的恢复过程。
场景 B:使用密钥(cryptsetup --key-description)
-
背景 :你已经有一个在内核密钥环中活跃的
trusted密钥(例如之前用keyctl add trusted生成的)。现在你要用它来解密一个磁盘分区。 -
流程:
-
cryptsetup将描述符"trusted:my_trusted_key"传递给内核。 -
内核在密钥环中找到该密钥的 ID(它已经在内存中)。
-
直接引用该密钥 (无需再次解密 Blob),传递给
dm-crypt模块。 -
dm-crypt使用该密钥对/dev/loop1进行加解密操作。
-
-
结果 :密钥被"使用"于实际数据加密。这是"不落盘"的应用过程。
3. 图解对比
text
【导入】caam-keygen import my_key.bb my_key
磁盘(Blob密文) → CAAM硬件(解密) → 内核密钥环(创建密钥ID)
↓ ↓ ↓
持久化存储 硬件内部解密 应用可引用
【使用】cryptsetup --key-description "trusted:my_trusted_key"
应用(描述符) → 内核密钥环(查找ID) → dm-crypt(加解密I/O)
↓ ↓ ↓
用户态发起 内核态引用 硬件/内核处理数据
4. 为什么需要这两个步骤?
-
导入:解决"密钥持久化"问题。密钥明文不能落盘,但密文 Blob 可以。导入是将密文恢复为可用密钥的唯一方式。
-
使用:解决"密钥应用"问题。恢复后的密钥必须能被实际用于加密任务(如磁盘加密、TLS 等)。
1. 落盘的是"密文",不是"明文"
-
Blob 文件 (如
my_key.bb)是 CAAM 用芯片唯一密钥(OTPMK)加密后的数据。 -
即使攻击者拿到这个文件,没有你的芯片就无法解密。
-
明文密钥从未写入 Flash/eMMC/SD 卡。
2. 解密发生在哪里?
-
导入时 :
caam-keygen import将 Blob 发送给 CAAM 硬件,在硬件内部解密。 -
明文密钥:
-
解密后,明文密钥被存入 内核密钥环(内核内存)。
-
用户态(如
cryptsetup)无法通过任何系统调用读取该明文。 -
只有内核模块(如
dm-crypt、AF_ALG)可以引用该密钥的 ID 来使用。
-
3. "通过明文密钥进行加解密"的具体过程
-
当你使用
cryptsetup --key-description "trusted:mykey"时:-
cryptsetup将描述符传递给内核。 -
内核在密钥环中找到该密钥 ID。
-
内核直接将该密钥(明文)传递给
dm-crypt模块。 -
dm-crypt使用该密钥加密/解密磁盘数据。
-
-
整个过程中,明文密钥一直在内核态,从未进入用户态内存。