密码学基础回顾:对称加密、非对称加密、哈希函数、数字签名与证书
说实话,很多做嵌入式TLS的朋友,一开始都栽在密码学基础上。我见过有人把AES的密钥直接硬编码在固件里,也见过有人用RSA加密大数据块导致内存溢出。嗯,这一章我们就来把这些基础概念彻底理清楚。
核心观点:TLS的安全性建立在四种密码学原语的组合之上。你不需要成为密码学家,但必须理解每种算法的用途、局限性和在嵌入式环境下的选型要点。
2.1 对称加密:AES
对称加密,说白了就是加密和解密用同一把钥匙。你在嵌入式设备里存一个密钥,发数据前加密,收到数据后解密。简单高效,但密钥分发是个麻烦事——这个我们后面讲TLS握手时会看到怎么解决。
AES(Advanced Encryption Standard)是目前最主流的对称加密算法。我个人习惯在嵌入式项目里优先选AES-128,原因很简单:128位密钥已经足够安全,而且比AES-256快不少,尤其在没有硬件加速的MCU上。
| 模式 | 特点 | 嵌入式适用场景 |
|---|---|---|
| ECB | 每个块独立加密,相同明文得到相同密文 | 不要用——有模式攻击风险 |
| CBC | 需要IV,前一个密文块参与当前块加密 | 常用,但注意IV不能重复 |
| CTR | 将块密码变成流密码,可并行计算 | 适合资源受限设备,速度快 |
| GCM | 同时提供加密和认证(AEAD) | TLS首选,一次搞定加密+完整性校验 |
我的经验:在TLS 1.3中,AES-GCM是标配。我曾经在一个IoT项目里用CBC模式,结果忘了处理IV的随机性,导致两个设备用相同IV加密了相同数据——嗯,攻击者一眼就看出了模式。从那以后,我只要硬件支持,一律上GCM。
2.2 非对称加密:RSA与ECC
非对称加密用一对密钥:公钥加密,私钥解密。公钥可以公开,私钥必须保密。这解决了对称加密的密钥分发问题,但代价是慢——慢很多。
RSA是最经典的非对称算法。它的安全性基于大整数分解的困难性。你想想看,两个大素数相乘很容易,但反过来分解就很难。RSA的密钥长度通常用2048位或4096位。
ECC(椭圆曲线密码学)是后起之秀。同样的安全强度下,ECC的密钥长度短得多。比如256位的ECC曲线(如secp256r1)提供约128位的安全强度,相当于3072位的RSA。
| 算法 | 密钥长度(同等安全强度) | 签名速度 | 嵌入式适用性 |
|---|---|---|---|
| RSA-2048 | 2048位 | 签名慢,验证快 | 需要较大存储和计算资源 |
| ECC-256 | 256位 | 签名快,验证稍慢 | 非常适合嵌入式,密钥小、省电 |
避坑指南:我曾经在一个低功耗传感器项目里用了RSA-4096做签名验证。结果每次握手要花3秒,电池一周就耗光了。后来换成ECC-256,握手时间降到200毫秒,续航提升到三个月。选型时一定要考虑嵌入式设备的算力和功耗预算。
2.3 哈希函数:SHA256
哈希函数把任意长度的数据映射成固定长度的摘要。它是单向的——你无法从摘要反推出原始数据。SHA256输出256位(32字节)的摘要,是TLS中最常用的哈希算法。
哈希函数在TLS里干三件事:
- 消息完整性校验——确保数据没被篡改
- 数字签名的中间步骤——先哈希再签名,效率更高
- 密钥派生——从共享秘密生成会话密钥
注意:SHA256不是加密,是哈希。加密可以解密,哈希不行。很多新手把这两个概念搞混,结果在设计协议时出现严重安全漏洞。
2.4 数字签名与证书
数字签名解决的是「谁发的」和「有没有被改过」这两个问题。流程很简单:发送方用私钥对数据的哈希值签名,接收方用公钥验证签名。
但这里有个问题——你怎么知道公钥是属于对方的?万一中间人把自己的公钥换上去呢?这就是数字证书要解决的问题。
数字证书是由证书颁发机构(CA)签发的电子文档,把公钥和身份信息绑定在一起。CA用自己的根证书私钥给服务器证书签名,而根证书预装在设备里。这样就形成了一条信任链。
// 典型的X.509证书结构(简化版)
证书:
版本号: 3
序列号: 0x12345678
签名算法: sha256WithRSAEncryption
颁发者: CN=MyRootCA
有效期: 2024-01-01 到 2025-01-01
主体: CN=mydevice.example.com
公钥: (ECC公钥数据)
扩展: 密钥用途 = 数字签名, 服务器认证
// 以上是待签名部分
签名值: (CA私钥对以上内容的签名)
我的习惯:在嵌入式设备里,我通常只预置CA根证书,不预置服务器证书。这样当服务器证书过期或更换时,不需要更新固件。设备在握手时验证服务器证书的签名链是否追溯到预置的根证书即可。
2.5 知识体系总览
下面这张图把本章的核心关系梳理清楚了。我建议你把它存下来,后面学TLS握手流程时经常回来对照。
2.6 小结
这一章我们覆盖了TLS依赖的四个密码学基础模块。你不需要记住所有算法的数学细节,但必须理解:
- AES-GCM是TLS 1.3中数据加密的标准选择
- ECC比RSA更适合嵌入式环境,密钥小、速度快
- SHA256用于完整性校验和密钥派生
- 数字证书解决了公钥的信任问题,是TLS握手安全的前提
最后提醒一句:千万不要自己实现这些密码算法。我在早期项目里犯过这个错——自己写了个AES实现,结果有侧信道漏洞,密钥被功耗分析攻击提取出来了。用现成的、经过审计的库,比如mbedTLS、OpenSSL或WolfSSL。这是底线。