加密原理(上):对称加密、非对称加密、混合加密机制
聊到 HTTPS,绕不开的一个核心就是加密。说实话,我在早期做 Web 开发时,对加密的理解仅仅停留在“把数据弄乱,让别人看不懂”。后来在做公司的一个支付项目时,才真正被上了一课。
那次我们直接用对称密钥加密了所有请求,结果密钥在客户端和服务器之间传输时被截获了。你能想象吗?加密后的数据对方直接就能解开。嗯,这就是典型的“锁被挂在了没上锁的箱子里”。
所以,搞懂加密的三种机制,是理解 HTTPS 安全体系的基石。下面我把这三种机制拆开揉碎了讲清楚。
对称加密:效率高,但有个致命问题
对称加密,说白了就是加密和解密用同一把钥匙。就像你家的门锁,插进去转一下锁上,再转一下打开。
它的优点是 速度快,特别适合加密大量数据。我在处理日志加密时,用过 AES-256 加密 TB 级别的数据,吞吐量能到 GB/s 级别,非对称加密根本做不到。
但对称加密有一个 致命缺陷:密钥怎么安全地传给对方?
你想想看,如果你和远在国外的朋友通信,你把门锁和钥匙都寄过去了。中途快递被人拆开,偷配了一把钥匙。后面所有的通信都是不安全的。
典型对称加密算法:
- AES(Advanced Encryption Standard):当前最主流的对称加密算法,密钥长度 128/192/256 位。
- DES(Data Encryption Standard):老算法,密钥只有 56 位,现在能暴力破解,别用了。
- 3DES:DES 的加强版,效率低,逐渐被 AES 替代。
我在项目中遇到过最尴尬的一次——客户要求我们用 3DES。我问为什么,他说“听起来更安全,因为三个 DES”。我当时差点没绷住。
我的建议:新项目一律用 AES-256。别碰 DES 和 3DES,除非你在维护十年前的遗留系统。
非对称加密:安全性高,但慢得让人抓狂
非对称加密引入了 公钥 和 私钥 的概念。公钥可以公开给别人,私钥只有自己知道。
核心逻辑是:公钥加密的内容,只能用私钥解密。 反过来,私钥加密的内容,只能用公钥解密。
这样,你就不用再担心“钥匙在传输过程中被偷”了。因为公钥本来就是公开的,别人拿到也解不开只有私钥才能解开的密文。
但非对称加密的 性能是个大问题。拿 RSA 举例,2048 位的 RSA,加解密速度大约是 AES 的千分之一到万分之一。你要用非对称加密加密一个 1GB 的视频文件?等你加完密,天都黑了。
注意:别直接用非对称加密加密大块数据,这是新手容易犯的错误。我见过有同学用 RSA 加密一张高清图片,结果前端页面卡死了 3 秒。
典型的非对称加密算法:
- RSA(Rivest-Shamir-Adleman):应用最广,密钥长度至少 2048 位。安全性基于大整数分解难题。
- ECC(Elliptic Curve Cryptography):椭圆曲线加密,同样安全强度下,密钥更短,速度更快。现在很多现代系统(包括 TLS 1.3)都推荐 ECC。
- DH(Diffie-Hellman):主要用于密钥交换,不直接用于加解密。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1 个(共享密钥) | 2 个(公钥 / 私钥) |
| 速度 | 快(硬件加速可达 GB/s) | 慢(通常是对称的 1/1000) |
| 安全性基础 | 密钥保密性 | 数学难题(大整数分解或椭圆曲线离散对数) |
| 典型算法 | AES、ChaCha20 | RSA、ECDSA、Ed25519 |
| 应用场景 | 批量数据加密 | 密钥交换、数字签名 |
混合加密机制:取长补短,HTTPS 的解决方案
对称加密快但密钥分发难,非对称加密安全但慢得像蜗牛。那怎么办呢?
答案是 混合起来用。这也是 HTTPS 在 TLS 握手阶段采用的核心策略。
简单来说就是两步走:
- 用 非对称加密 安全地传输一个临时的对称密钥(这个密钥叫会话密钥 / Session Key)。
- 双方拿到会话密钥后,后续所有通信都用 对称加密(如 AES)来加解密数据。
这样做的好处很明显:既享受了非对称加密在“密钥分发”环节的安全,又保留了对称加密在“大批量数据传输”环节的高效。
我曾经在一次内部培训上问学员:“如果你的浏览器和服务器之间有一段非对称加密加解密的过程,你会感觉到延迟吗?”答案是几乎不会。因为混合加密只在一开始用非对称交换密钥,后面全是高速的对称加密。
关键流程示意(TLS 1.2 的混合加密):
- 客户端向服务器索要公钥。
- 服务器把公钥(含在证书中)发给客户端。
- 客户端用公钥加密一个随机生成的对称密钥(Pre-Master Secret)。
- 服务器用私钥解密,得到对称密钥。
- 双方用这个对称密钥进行后续的 AES 对称加密通信。
你可能会问,为什么不直接用公钥加密所有数据?嗯,这就像你用金条去搭房子——能用,但太浪费。金条应该用来做地基的关键支撑,墙体和屋顶用普通的砖石就行。
一点补充:现代 TLS 1.3 进一步优化了握手次数,但混合加密的思路没变。它依然是“用非对称握手,用对称传数据”。
为了让你更直观地理解这三者之间的关系,我画了一张图:
从这张图可以看得很清楚:单独使用对称或非对称加密,都有各自的短板。混合加密把两者的优势组合起来,这也是 HTTPS 能兼顾安全与性能的根本原因。