密码学基础回顾:对称加密与非对称加密、哈希函数、数字签名、密钥派生函数(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. 用私钥加密这个摘要(实际是签名算法,不完全是加密)
  3. 把签名附在消息后面发出去
  4. 验证者用公钥解密签名,得到摘要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里,这五者缺一不可。

密码学基础概念关系图 TEE安全基础 对称加密 非对称加密 哈希函数 数字签名 密钥派生(KDF) 说明: 对称/非对称加密 → 保证机密性 哈希函数 → 保证完整性(数据未被篡改) 数字签名 → 保证身份认证 + 不可否认性 KDF → 从主密钥安全派生多个子密钥

好了,这一章的内容就到这儿。这些概念看起来简单,但每个都值得深挖。后面讲SM2算法和TEE密钥派生时,我们会反复用到这些知识。你最好把这张图存下来,后面忘了随时回看。