Android FBE密钥存储与生命周期全解析 Android FBE密钥存储、来源与生命周期深度解析这是Android加密最核心也最容易被误解的部分。我会用最清晰的方式拆解所有密钥的精确存储位置、开机解密的完整链条、每个密钥的完整生命周期以及TEE中真正永久不变的根密钥。一、核心结论先览没有任何用户密钥以明文形式永久存储永久存储的只有加密后的密钥包裹(KeyBlob)真正的根密钥(HUK)烧录在芯片硬件中永远无法被读取或导出所有明文密钥只存在于内存中重启后立即彻底消失TEE是唯一能解密KeyBlob的地方普通世界(Android系统)永远看不到明文主密钥二、所有密钥的精确存储位置密钥层次与存储位置对照表密钥类型明文存在位置加密形式存储位置能否被导出硬件唯一密钥(HUK)仅存在于TEE硬件寄存器无烧录在芯片熔丝中绝对不能安全存储密钥(SSK)仅存在于TEE内部RAM加密存储在RPMB分区不能KeyMint根密钥仅存在于TEE内部RAM加密存储在RPMB分区不能System DE主密钥内核密钥环(内存)/data/misc/vold/目录下的KeyBlob不能User DE主密钥内核密钥环(内存)/data/misc/vold/目录下的KeyBlob不能User CE主密钥内核密钥环(内存)/data/misc/vold/目录下的KeyBlob不能每文件密钥(FEK)内核文件系统缓存存储在文件扩展属性(xattr)中不能扇区密钥内联加密引擎(ICE)寄存器不存储动态派生不能关键细节解释KeyBlob是什么KeyBlob是被KeyMint用硬件根密钥加密后的主密钥本质是一个二进制文件存储在普通世界的/data/misc/vold/目录文件名格式key_大小约100-200字节只能由生成它的设备的KeyMint解密在其他任何设备上都是乱码为什么KeyBlob可以安全地存储在普通世界KeyBlob使用AES-GCM加密并带有完整性校验解密密钥(HUK)永远不会离开TEE硬件即使攻击者获取了整个eMMC的完整镜像没有HUK也无法解密任何KeyBlobRPMB分区的作用RPMB是eMMC/UFS芯片中的一个特殊硬件分区只有TEE可以访问普通世界无法直接读写存储KeyMint的根密钥和Weaver的防暴力破解计数器提供防重放攻击保护防止攻击者回滚到旧的密钥版本三、每次开机解密密钥从哪里来完整的开机密钥解密流程图eMMC芯片 ├─ RPMB分区 → 存储KeyMint根密钥(加密) └─ userdata分区 → 存储System DE/User DE/User CE KeyBlob ↓ 开机时TEE自动启动 ↓ TEE使用硬件熔丝中的HUK解密RPMB中的KeyMint根密钥 ↓ KeyMint根密钥加载到TEE内部RAM(永远不会离开) ↓ Android系统启动vold读取userdata中的KeyBlob ↓ vold将System DE KeyBlob发送给KeyMint(TEE) ↓ KeyMint使用KeyMint根密钥解密System DE KeyBlob ↓ KeyMint将明文System DE主密钥返回给vold ↓ vold将System DE主密钥安装到内核密钥环(内存) ↓ 用户输入密码 ↓ Gatekeeper验证密码通过返回签名的AuthToken ↓ vold将User CE KeyBlob AuthToken发送给KeyMint ↓ KeyMint验证AuthToken签名有效 ↓ KeyMint解密User CE KeyBlob返回明文主密钥给vold ↓ vold将User CE主密钥安装到内核密钥环 ↓ 加密完成所有文件可访问最关键的安全设计密钥解密完全在TEE内部完成普通世界的vold进程只是一个搬运工它看不到解密过程只能拿到最终的明文密钥AuthToken是一次性的由Gatekeeper用TEE私钥签名有效期只有10秒无法伪造或重用密钥传递通道是安全的TEE和普通世界之间的通信使用共享内存并且有严格的访问控制四、每个密钥的完整生命周期1. 硬件根密钥(HUK)生成芯片制造时由厂商烧录到一次性可编程(OTP)熔丝中使用仅用于解密RPMB中的KeyMint根密钥销毁永远不会被销毁与芯片物理寿命相同特性每个芯片全球唯一无法修改无法读取2. KeyMint根密钥生成设备首次启动时由KeyMint在TEE中生成使用用于加密/解密所有用户主密钥的KeyBlob存储加密后存储在RPMB分区运行时存在于TEE内部RAM销毁恢复出厂设置时会被销毁并重新生成特性设备唯一与HUK绑定无法导出3. System DE主密钥生成设备首次启动时由KeyMint生成加载每次系统启动时自动解密并加载到内核密钥环使用用于解密System DE和User DE目录下的所有文件销毁系统关机或重启时内核密钥环被清空密钥彻底消失特性不需要用户密码即可解密系统启动后自动可用4. User CE主密钥生成用户首次设置锁屏密码时由KeyMint生成加载用户输入正确密码并通过验证后解密并加载到内核密钥环使用用于解密User CE目录下的所有文件(绝大多数应用数据)销毁系统关机或重启时销毁锁屏不会销毁只有重启才会特性与用户密码绑定没有密码永远无法解密5. 每文件密钥(FEK)生成创建新文件时由内核fscrypt子系统动态生成派生由主密钥文件inode号随机数通过HKDF派生存储加密后存储在文件的扩展属性(xattr)中使用文件被打开时派生用于加密/解密文件内容销毁文件被关闭时从内核缓存中清除特性每个文件唯一一个文件泄露不影响其他文件五、TEE中哪些密钥是永远不变的绝对永久不变的密钥只有硬件唯一密钥(HUK)是真正永远不变的。它被烧录在芯片的OTP熔丝中一旦写入就无法修改或擦除即使恢复出厂设置、重刷系统甚至更换主板上的eMMC芯片HUK也不会改变。不同芯片厂商对HUK的称呼略有不同高通QFPROM(高通熔丝)中的Chip Unique Key联发科EFUSE中的Chip ID和Secure Root Key三星eFuse中的Unique ID和Root Key设备生命周期内不变的密钥KeyMint根密钥在设备首次启动时生成之后在设备的整个生命周期内保持不变除非执行了以下操作恢复出厂设置重新刷写官方系统并清除所有数据解锁Bootloader(大多数设备会自动触发恢复出厂设置)会定期变化的密钥用户主密钥(DE/CE)用户修改锁屏密码时会重新生成每文件密钥(FEK)每次创建新文件时生成新的密钥AuthToken每次用户解锁时生成一个新的10秒后过期六、常见误解澄清误解1密钥存储在TEE中不准确。TEE中只存储根密钥(HUK和KeyMint根密钥)用户主密钥的加密版本(KeyBlob)存储在普通世界的/data/misc/vold/目录中。这种设计的好处是可以支持无限多个用户和密钥可以轻松添加或删除密钥槽不需要占用TEE有限的存储空间误解2Root后可以导出所有密钥部分正确但有前提。Root后确实可以读取内核密钥环中的明文主密钥但Root需要先解锁Bootloader解锁Bootloader会自动触发恢复出厂设置清除所有用户数据因此对于已经设置了锁屏密码的丢失设备攻击者无法通过Root获取密钥误解3更换eMMC芯片可以绕过加密不可能。因为KeyBlob是用原设备的HUK加密的新eMMC芯片中的KeyBlob在原设备上可以解密但原设备的KeyBlob在新设备上无法解密。误解4厂商有后门可以解密用户数据对于符合Google安全标准的设备没有。所有密钥都与用户密码和设备硬件绑定即使是Google和设备厂商也无法解密用户数据。七、总结Android FBE的密钥体系设计遵循了最小权限原则和分层防御原则最核心的根密钥被硬件保护永远无法被读取所有用户密钥都被加密存储只有在需要时才解密到内存所有明文密钥都是临时的重启后立即消失任何环节被攻破都不会导致整个加密体系崩溃这种设计使得Android 10及以上设备的加密强度达到了军事级别在没有用户密码的情况下即使拥有最先进的技术和设备也无法解密用户数据。