密码学基础回顾:对称加密、非对称加密、哈希函数、数字签名、密钥交换协议
好,咱们正式开始技术内容之前,得先把密码学这块地基夯实了。说实话,我见过太多做硬件安全的工程师,上来就调 API、配证书,结果密钥怎么泄露的都不知道。你想想看,如果连加密算法是干什么的都没搞明白,后面做 TLS 双向认证肯定要踩坑。
这一章我会把五个核心概念串起来讲。对称加密、非对称加密、哈希函数、数字签名、密钥交换协议——它们不是孤立的,而是环环相扣的。我个人习惯把这五样东西比作「工具箱里的五把扳手」,每把都有专门的用处,但组合起来才能拧紧 TLS 这颗大螺丝。
2.1 对称加密:又快又简单,但有个致命问题
对称加密,说白了就是加密和解密用同一把钥匙。你拿钥匙锁门,也用同一把钥匙开门。这个场景大家应该很熟悉:AES、DES、SM4 都属于这一类。
我在项目中遇到过不少团队,为了性能选 AES-128-GCM,结果密钥分发全靠硬编码在代码里。嗯,这里要注意——对称加密最大的痛点不是算法本身,而是「怎么把密钥安全地交给对方」。你通过网络传密钥,等于把钥匙放在门垫下面。
| 算法 | 密钥长度 | 典型场景 |
|---|---|---|
| AES-128 | 128 bit | 文件加密、磁盘加密 |
| AES-256 | 256 bit | TLS 记录层加密 |
| SM4 | 128 bit | 国密合规场景 |
2.2 非对称加密:公钥私钥,天生一对
非对称加密解决了对称加密的密钥分发难题。它用一对密钥:公钥公开,私钥自己藏好。你用我的公钥加密数据,只有我能用私钥解密。反过来,我用私钥签名,你用公钥验签。
RSA 和 ECC 是两大主流。我个人更偏爱 ECC,因为同等安全强度下,ECC 的密钥更短、计算更快。举个例子:256 位的 ECC 密钥,安全性和 3072 位的 RSA 差不多。这对硬件密钥来说太重要了——芯片上的存储空间和算力都金贵得很。
2.3 哈希函数:不可逆的「指纹」
哈希函数能把任意长度的数据,压缩成固定长度的摘要。而且这个过程不可逆——你没法从摘要反推出原文。SHA-256、SM3 都是常用的哈希算法。
你想想看,哈希函数在 TLS 里干什么用?它用来做消息完整性校验。握手过程中,双方交换的每一段消息都会算一个哈希值,谁要是篡改了数据,哈希值就对不上。
我记得有一次做安全审计,发现有人用 MD5 做证书指纹验证。MD5 早就被证明可以碰撞了,这等于给攻击者留了后门。所以我的建议是:哈希函数至少用 SHA-256,别图省事用老算法。
2.4 数字签名:证明「你是谁」和「你没改过」
数字签名 = 哈希函数 + 非对称加密。先对数据算哈希,再用私钥加密这个哈希值。验证时,用公钥解密签名得到哈希值,再和数据的哈希值比对。如果一致,说明数据没被改过,而且确实是你签的。
这个机制在 TLS 双向认证里是核心。客户端用私钥签名证书,服务端用公钥验签——双方互相证明身份。我在做硬件密钥产品时,私钥是永远不离开安全芯片的,签名操作在芯片内部完成。这样就算攻击者物理接触了设备,也拿不走私钥。
// 伪代码:签名与验签流程
// 签名方
hash = SHA256(message)
signature = RSA_private_encrypt(hash, private_key)
// 验签方
decrypted_hash = RSA_public_decrypt(signature, public_key)
if decrypted_hash == SHA256(message):
print("签名验证通过")
else:
print("签名无效")
2.5 密钥交换协议:安全地商量一把「临时钥匙」
对称加密快,但密钥分发难。非对称加密能解决分发问题,但速度慢。怎么办?答案是:用非对称加密来协商一把临时的对称密钥,然后用这把对称密钥加密后续通信。
这就是密钥交换协议干的事。经典的 Diffie-Hellman (DH) 协议,以及它的变种 ECDHE,是 TLS 握手的核心。双方各自生成一对临时密钥,交换公钥部分,然后各自算出相同的共享密钥。即使攻击者截获了所有交换数据,也算不出这个共享密钥。
我个人强烈推荐 ECDHE。它支持前向安全性——就算服务器私钥泄露了,之前记录的通信内容也无法被解密。你想想看,如果用了静态 RSA 密钥交换,私钥一丢,所有历史通信全完蛋。
2.6 知识体系总览
下面这张图把五个概念的关系画清楚了。你可以看到,对称加密和非对称加密是基础工具,哈希函数提供完整性校验,数字签名把哈希和非对称结合起来,密钥交换协议则负责安全地生成会话密钥。TLS 双向认证就是把这些工具按顺序组装起来。
2.7 小结:这些概念怎么串起来用?
讲到这里,你应该能感觉到:这五个概念不是各自为战的。对称加密负责效率,非对称加密负责安全分发,哈希函数负责完整性,数字签名负责身份认证,密钥交换协议负责临时会话密钥的生成。
在后续的 TLS 双向认证实战中,你会看到它们如何协同工作。比如握手阶段用 ECDHE 协商密钥,用数字签名验证证书,用对称加密保护应用数据。每一步都踩在前面的基础上。
嗯,这一章的内容就到这里。记住这些基础,后面我们才能放心地深入硬件密钥和 TLS 的细节。