解密三大加密流派:对称、非对称与哈希
大家好,我是这门课的主讲。今天咱们聊聊加密的基础——三种最核心的加密方式。说实话,很多人学了几年开发,对这几个概念还是有点模糊。
我个人习惯把加密比作“锁门”。你想想看:对称加密像是用一把钥匙开一把锁;非对称加密像是每个人都有一把特殊的锁和一把特殊的钥匙;哈希函数呢,更像是指纹识别——只能录入,不能还原。
对称加密:一把钥匙,开一把锁
对称加密,最古老也最直接。加密和解密用的是同一个密钥。就像你在家锁门,进门时用同一把钥匙。
我个人的经验: 在微服务内部通信中,对称加密是首选。因为通信双方可以预先协商好密钥,性能比非对称高一个数量级。我曾经在某个项目中用 AES-256 加密几十万的日志字段,单机吞吐量还能跑到 5000+ QPS。
常见的对称加密算法:
| 算法 | 密钥长度 | 特点 | 典型场景 |
|---|---|---|---|
| AES | 128/192/256 bit | 安全、高效、硬件加速 | 文件加密、HTTPS 传输 |
| DES | 56 bit | 太短,已被破解 | 已淘汰,别用 |
| 3DES | 112/168 bit | 兼容旧系统 | 遗留系统,建议迁移 |
| SM4 | 128 bit | 国密标准 | 国内合规场景 |
注意: 我曾经在项目里踩过坑——把 AES 的密钥直接硬编码在代码里,结果代码被泄露到内网,整个系统的加密形同虚设。记住:密钥管理比加密算法本身更重要。
非对称加密:公钥锁,私钥开
非对称加密用一对密钥:公钥(可以公开)和私钥(必须保密)。
公钥加密的数据只能用私钥解密,反过来私钥签名的数据可以用公钥验证。这种机制解决了对称加密的“密钥分发”难题——你不用提前和对方商量密钥。
但,它有个代价:慢。非对称加密比对称加密慢几百倍。所以实际中我们很少用非对称加密大量数据,而是用它来“交换对称密钥”或“数字签名”。
主流非对称算法:
- RSA: 最常用,基于大数分解。2048 位以上算安全。我建议生产环境至少用 3072 位。
- ECC(椭圆曲线): 256 位 ECC 安全等级 ≈ 3072 位 RSA。算力要求低,移动端首选。
- SM2: 国密椭圆曲线算法,目前国内很多政企项目强制要求。
关键概念: 非对称加密只能加密少量数据(通常不超过密钥长度的 1/8)。比如 RSA-2048 最多加密 190 字节,所以直接加密大文件会失败。我在项目中曾经用 RSA 加密一个 256 字节的对称密钥,再用对称密钥加密整个文件——这就是混合加密。
哈希函数:单向指纹
哈希函数不是加密,它没有解密过程。输入任意长度,输出固定长度摘要。说白了,像给数据算一个“身份证号”。
好的哈希函数有三个特征:
- 单向性: 从摘要不能反推原文。
- 抗碰撞性: 很难找到两个不同的输入产生相同的摘要。
- 雪崩效应: 输入变一点点,摘要完全变样。
常见哈希算法:
| 算法 | 输出长度 | 安全性 | 避坑提示 |
|---|---|---|---|
| MD5 | 128 bit | 已破解,可碰撞 | 别拿来签名,只用来做校验 |
| SHA-1 | 160 bit | 已理论破解 | 合规评审过不去 |
| SHA-256 | 256 bit | 安全(2025年) | 现阶段推荐 |
| SM3 | 256 bit | 国密,安全 | 国内项目首选 |
避坑指南: 我曾经在接口签名中用 SHA-1,上线半年后安全团队扫描出问题,紧急全量换 SHA-256。那个周末我加班到凌晨三点。现在就默认 SHA-256 吧,别犹豫。
三种技术的关系图
你可能会问:对称加密和非对称加密,到底什么时候用哪个?我有个简单的判断方法。
- 如果你能控制双方环境,且需要高性能: 对称加密。
- 如果你需要和陌生人安全通信,且能接受慢一点: 非对称加密(通常只用来交换对称密钥)。
- 如果你只是想校验数据有没有被改过,或者存密码: 哈希 + 加盐。
混合加密:实践中真正的方案
实际项目中,基本没人只用一种加密。最常见的是“混合加密”:
- 客户端生成一个临时对称密钥(比如 AES 密钥)。
- 用服务器的公钥(RSA/ECC)加密这个对称密钥。
- 用对称密钥加密业务数据。
- 服务器用私钥解密得到对称密钥,再用对称密钥解密业务数据。
这个流程既解决了密钥分发问题,又解决了性能问题。我做过一个支付服务,每天几百万笔交易,用的就是这个模式。
一句话总结: 对称加密管速度,非对称加密管密钥分发,哈希函数管防篡改。各自分工明确,组合起来就是现代加密通信的基石。
性能对比表
| 操作 | 时间消耗(相对) | 说明 |
|---|---|---|
| AES-256 加密 1KB 数据 | 1x | 极快,硬件支持 |
| SHA-256 哈希 1KB 数据 | 0.8x | 略快于 AES |
| RSA-2048 加密/解密 | 200~500x | 慢,避免频繁使用 |
| ECC-256 签名/验证 | 50~100x | 比 RSA 好很多 |
又一个坑: 我见过有人用哈希函数“加密”用户密码,直接存 SHA-256 的十六进制串。结果彩虹表一把梭,密码全泄露。记住:密码存储必须加盐,而且推荐用 bcrypt、scrypt 或 argon2 这种慢哈希。
小结
这三种加密方式就像工具箱里的三把利器。用对了,你的接口安全性能提升一大截;用错了,漏洞百出。我建议你对照这张表来选型:
- 需要加密大量数据,且通信双方信任: 对称加密(AES-GCM 模式)。
- 需要安全分发密钥或数字签名: 非对称加密(ECC 优先)。
- 需要校验数据完整性或存储敏感信息: 哈希函数(SHA-256 / SM3 + 盐)。
下节课我会带你实战——用 Python 实现这三种加密。到时候你会发现,理论到代码就隔着一层窗户纸。