密码学基础回顾:对称加密与非对称加密、哈希函数、数字签名、密钥派生函数(KDF)概念
各位同学好,我是老张。今天咱们聊点基础但极其重要的东西——密码学核心概念。你可能会想:「都做TEE了,还讲这些干嘛?」
说实话,我当年刚接触TEE时也这么想。结果第一次做密钥派生就踩了坑,回头才发现是哈希函数选型出了问题。嗯,基础不牢,地动山摇。咱们先把这几块基石夯实了,后面讲SM2和密钥派生时才不会晕。
对称加密:又快又简单,但密钥怎么传?
对称加密,说白了就是加密和解密用同一把钥匙。你想想看,就像你家大门,用一把钥匙锁上,也用同一把钥匙打开。
常见的对称算法有AES、SM4(国密标准)。在TEE场景里,我习惯用AES-256-GCM,因为它自带认证加密,能同时保证机密性和完整性。
核心特点:
- 加密速度快,适合大数据量
- 密钥长度相对较短(128/256位)
- 最大痛点:密钥分发问题——你怎么把密钥安全地告诉对方?
我在项目中遇到过一件事:两个安全芯片之间需要交换会话密钥,直接用对称加密传密钥,结果被中间人截了。后来才改成用非对称加密来协商对称密钥。这就是为什么我们需要下一块内容。
非对称加密:公钥随便给,私钥自己藏
非对称加密,密钥成对出现——公钥和私钥。公钥可以公开,私钥必须保密。你用公钥加密,只有对应的私钥能解密。
常用的有RSA、ECC(椭圆曲线),国密里就是SM2。我个人偏爱ECC,因为同等安全强度下,ECC的密钥长度更短,计算效率更高。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1个(共享密钥) | 2个(公钥+私钥) |
| 速度 | 快(硬件加速可达GB/s) | 慢(通常用于小数据) |
| 典型用途 | 批量数据加密 | 密钥交换、数字签名 |
| 国密标准 | SM4 | SM2 |
实际项目中,没人会用非对称加密去加密一个大文件。太慢了。正确的做法是:用非对称加密协商一个临时对称密钥,然后用这个对称密钥去加密实际数据。这叫「混合加密」,TEE里大量使用这个模式。
哈希函数:不可逆的「数字指纹」
哈希函数,你给它任意长度的输入,它给你一个固定长度的输出。而且这个输出看起来完全是随机的。关键特性:
- 单向性:从哈希值反推原始输入,计算上不可行
- 抗碰撞性:很难找到两个不同输入产生相同哈希值
- 雪崩效应:输入改一个bit,输出完全变样
常用的有SHA-256、SM3(国密)。在TEE里,哈希函数无处不在——代码完整性校验、密钥派生、数字签名,哪哪都离不开它。
我的经验:做TEE开发时,一定要确认你用的哈希函数是「抗长度扩展攻击」的。SHA-256有这个问题,所以HMAC或SHA-3会更安全。我曾经因为这个疏忽,在密钥派生时被攻击者预测了后续密钥块……嗯,那是个加班的夜晚。
数字签名:证明「你是谁」和「你没改过」
数字签名解决两个问题:身份认证和完整性验证。签名者用私钥对消息的哈希值签名,验证者用公钥验签。
流程很简单:
- 对消息做哈希,得到摘要
- 用私钥加密这个摘要(实际是签名算法,不完全是加密)
- 把签名附在消息后面发出去
- 验证者用公钥解密签名,得到摘要1;再对消息做哈希得到摘要2;两个摘要一致则验证通过
在TEE里,数字签名用于认证TA(可信应用)的合法性。每次加载TA时,TEE内核都会验签,确保代码没有被篡改。SM2的数字签名算法就是基于椭圆曲线的,后面我们会手写实现。
密钥派生函数(KDF):从一根「主密钥」生出无数「子密钥」
这是咱们课程的核心概念之一。KDF,说白了就是从一个主密钥(比如用户密码、DH协商的共享密钥)派生出多个子密钥的算法。
为什么需要KDF?你想想看,一个应用可能需要加密密钥、HMAC密钥、IV向量……总不能都用同一个密钥吧?KDF就是干这个的。
KDF的标准流程:
- 输入:主密钥 + 盐值(Salt)+ 上下文信息
- 处理:使用HMAC或哈希函数迭代计算
- 输出:指定长度的派生密钥
常见的KDF有HKDF(RFC 5869)、PBKDF2、国密里的KDF(基于SM3)。在TEE里,KDF用于从平台根密钥派生出各个TA的专属密钥。我建议你重点掌握HKDF,它设计清晰,安全性有保障。
避坑指南:我曾经在项目里直接用主密钥的哈希值作为子密钥,结果被安全审计打回来了。正确的做法是使用专门的KDF,并且每次派生都要带不同的盐值和上下文。盐值可以公开,但必须唯一。没有盐值的KDF,就像没放盐的菜——能吃,但没味道,而且不安全。
知识体系总览
下面这张图把今天讲的核心概念串起来了。你可以看到,对称加密和非对称加密负责「加密」,哈希函数负责「完整性」,数字签名负责「认证」,而KDF负责「密钥管理」。在TEE里,这五者缺一不可。
好了,这一章的内容就到这儿。这些概念看起来简单,但每个都值得深挖。后面讲SM2算法和TEE密钥派生时,我们会反复用到这些知识。你最好把这张图存下来,后面忘了随时回看。