密码学基础回顾:对称加密与非对称加密、哈希函数、数字签名原理、密钥管理基础

各位同学,欢迎来到第二章。在正式进入 TEE 签名验签之前,咱们得先把密码学这块地基夯实了。我见过不少项目,TEE 环境搭得漂漂亮亮,结果密钥管理一塌糊涂,最后安全防线形同虚设。说白了,密码学基础不牢,上层建筑再花哨也没用。

这一章我会带着大家快速过一遍核心概念。别担心,我不会堆公式,咱们用工程师的视角来拆解。

2.1 对称加密:一把钥匙开一把锁

对称加密,顾名思义,加密和解密用的是同一把密钥。就像你家的门锁,用同一把钥匙锁门和开门。

核心特点:

  • 速度快:适合加密大量数据。我在项目中处理过 GB 级别的日志加密,对称加密几乎是唯一选择。
  • 密钥分发难:这是它最大的痛点。怎么把密钥安全地交给对方?你想想看,如果通过网络传输密钥,那密钥本身就可能被截获。

常见算法:

算法 密钥长度 典型应用场景
AES 128 / 192 / 256 位 文件加密、TLS 传输、磁盘加密
SM4 128 位 国密标准,国内商用系统常用
ChaCha20 256 位 移动端、嵌入式设备(性能优势明显)
我的经验: 在 TEE 内部,对称加密通常用于加密 Enclave 内的敏感数据。我个人习惯用 AES-256-GCM 模式,因为它自带认证加密,能同时保证机密性和完整性。

2.2 非对称加密:公钥私钥,各司其职

非对称加密引入了一对密钥:公钥和私钥。公钥可以公开,私钥必须保密。这解决了对称加密的密钥分发难题。

两种核心用法:

  • 加密:用公钥加密,只有对应的私钥能解密。适合别人给你发密文。
  • 签名:用私钥签名,别人用公钥验证。适合证明“这东西是我发的”。

常见算法:

算法 密钥长度 签名/验签性能
RSA 2048 / 4096 位 验签快,签名慢
ECDSA 256 / 384 位 签名快,密钥短,性能均衡
SM2 256 位 国密标准,基于椭圆曲线
Ed25519 256 位 签名极快,安全性高,现代首选
避坑指南: 我曾经在一个项目中看到有人用 RSA 1024 位密钥做签名,觉得够用了。结果没过多久,业界就爆出 1024 位 RSA 已被证明存在安全风险。现在低于 2048 位的 RSA,我建议直接拉黑。

2.3 哈希函数:数据的数字指纹

哈希函数能把任意长度的数据,映射成一个固定长度的摘要。它有几个关键特性:

  • 单向性:从摘要反推原始数据,理论上不可能。
  • 抗碰撞性:很难找到两个不同的输入,产生相同的输出。
  • 雪崩效应:输入改一个比特,输出会面目全非。

常见算法:

算法 输出长度 安全性状态
SHA-256 256 位 安全,广泛使用
SHA-3 可配置 新一代标准,抗量子攻击潜力
SM3 256 位 国密标准,等效于 SHA-256
MD5 128 位 已破解,仅用于校验,不可用于安全场景

核心作用: 在数字签名中,我们不会直接对原始消息签名(太慢),而是先对消息做哈希,再对哈希值签名。这样既保证了效率,又保证了完整性。

2.4 数字签名原理:签名与验签的完整流程

数字签名是哈希函数和非对称加密的完美结合。它的核心目标是:身份认证 + 数据完整性 + 不可否认性。

签名流程(发送方):

  1. 对原始消息做哈希,得到摘要。
  2. 用发送方的私钥对摘要加密,生成签名。
  3. 将原始消息和签名一起发送给接收方。

验签流程(接收方):

  1. 收到消息和签名后,对原始消息做同样的哈希,得到摘要 A。
  2. 用发送方的公钥对签名解密,得到摘要 B。
  3. 比较摘要 A 和摘要 B。如果一致,验签通过。

为什么会这样?因为只有持有私钥的人才能生成正确的签名。公钥是公开的,谁都可以验签,但伪造不了签名。

我的经验: 在 TEE 中做签名时,我建议把私钥永远锁在 Enclave 内部,永远不要导出。签名操作在 Enclave 内完成,外部只能拿到签名结果和公钥。这样即使主机被攻破,私钥也拿不走。
数字签名与验签流程 发送方(签名) 原始消息 哈希运算 私钥加密 签名结果 接收方(验签) 原始消息 哈希运算 签名结果 公钥解密 摘要比较 网络传输

2.5 密钥管理基础:安全的核心命脉

密钥管理是密码学里最容易被忽视、但也是最致命的一环。算法再强,密钥泄露了,一切归零。

密钥生命周期:

  • 生成:必须在可信环境中生成。在 TEE 中,我们通常用硬件随机数生成器。
  • 存储:私钥必须加密存储,最好由硬件安全模块(HSM)或 TEE 保护。
  • 分发:公钥可以通过证书链分发,私钥永远不分发。
  • 使用:限制使用次数和场景,避免滥用。
  • 轮换:定期更换密钥,降低单点泄露的风险。
  • 销毁:密钥不再使用时,必须安全擦除,不能留痕迹。
我曾经踩过的坑: 有次做项目,开发环境里为了方便,把私钥硬编码在代码里。结果代码不小心提交到了公开仓库。虽然及时发现并撤销了,但那种后背发凉的感觉,至今难忘。记住:私钥永远不要出现在代码、配置文件、日志里。

2.6 对称 vs 非对称:如何选择?

对比维度 对称加密 非对称加密
密钥数量 1 个(共享密钥) 2 个(公钥 + 私钥)
性能 快(适合大数据量) 慢(适合小数据量)
密钥分发 困难 容易(公钥可公开)
典型用途 数据加密、传输加密 数字签名、密钥交换
安全性依赖 密钥保密 私钥保密 + 公钥可信

在实际系统中,两者通常是配合使用的。比如 TLS 握手时,先用非对称加密协商出一个对称密钥,然后用对称加密传输数据。这就是所谓的混合加密。在 TEE 场景下,我们也会用类似思路:用非对称签名做身份认证,用对称加密保护 Enclave 内部数据。

总结一下: 对称加密管效率,非对称加密管安全分发,哈希函数管完整性,数字签名管身份认证。密钥管理管好这一切的根基。把这几个点吃透了,后面讲 TEE 签名验签方案时,你就能理解为什么每一步要这么设计。