1. 加密基础概念回顾:对称加密、非对称加密、哈希算法
说起加密,很多人第一反应就是「密钥」、「加密算法」这些词。但实际项目里,我发现很多同事对基础概念的理解还停留在「知道名字」的层面。尤其是部署后验证阶段,一旦加密功能出了问题,你不会分清楚是哪一层掉链子了。所以这一章,咱们先把底子打牢。
我个人的习惯是,不管多复杂的系统,都先从这三个最核心的加密概念入手:对称加密、非对称加密、哈希算法。它们各有各的脾气,也各有各的坑。下面咱们一个一个捋。
1.1 对称加密
对称加密,说白了就是一把钥匙开一把锁。加密和解密用同一个密钥。你想想看,给文件加个密码,解压时还要输入同一个密码——就是这个原理。
常见的对称算法有:
- AES(高级加密标准):目前最主流,密钥长度128/192/256位。我在项目中用得最多的是AES-256-GCM,自带认证模式,省掉了单独做HMAC的麻烦。
- DES:老古董了,密钥56位,已经不安全。偶尔在遗留系统里见过,但千万别在新系统里用。
- SM4:国密标准,国内项目必须支持的算法。我记得有一次对接政务云,对方明确要求只能用SM4,不然过不了等保。
1.2 非对称加密
非对称加密的核心思想是:公钥公开,私钥自己藏好。别人用你的公钥加密数据,只有你能用私钥解开。反之,你也可以用私钥签名,别人用公钥验证签名。
我刚开始做加密时,总觉得非对称加密「更安全」。后来踩了坑才发现——它只是解决了密钥分发问题,但性能是真的慢。一次RSA-2048解密大概需要几毫秒,而AES-256解密只要几微秒。所以实际场景中,非对称加密只用来做两件事:
- 加密对称密钥(密钥交换)
- 数字签名(身份认证与不可否认性)
常见的非对称算法:
| 算法 | 密钥长度 | 用途 | 注意 |
|---|---|---|---|
| RSA | 2048/3072/4096 | 加密、签名 | 1024位已不安全,别用 |
| ECC(椭圆曲线) | 256位(相当于RSA-3072) | 签名、密钥交换 | 性能好,密钥短,但我见过很多库的曲线参数没配对的坑 |
| SM2 | 256位 | 签名、密钥交换 | 国密标准,注意椭圆曲线参数为国密特定 |
1.3 哈希算法
哈希算法的最大特点:单向。你可以从输入计算出固定长度的摘要,但没法从摘要反推原始数据。它不叫「加密」,因为加密是可逆的,哈希不可逆。
我经常举一个例子:你下载一个ISO镜像,网站会提供一个SHA-256校验值。下载完后你本地算一遍,如果两个值一样,说明文件没被篡改。这就是哈希的典型用途——完整性校验。
哈希算法还有两个重要应用:
- 密码存储:不存明文,只存哈希。但注意,单纯哈希不够安全(彩虹表攻击),一般要加盐(salt)并迭代多次(比如bcrypt、scrypt、Argon2)。
- 消息认证码(HMAC):用密钥对消息做哈希,保证消息未被篡改且来源可信。
常见哈希算法:
| 算法 | 输出长度 | 安全性 | 备注 |
|---|---|---|---|
| MD5 | 128位 | 已破解,碰撞攻击容易 | 一定不要用!我见过有旧系统还在用MD5做签名,被攻击只是时间问题 |
| SHA-1 | 160位 | 理论上已不安全 | Google在2017年实现了SHA-1碰撞,现在停止使用 |
| SHA-256 | 256位 | 目前安全 | 最推荐,广泛使用 |
| SM3 | 256位 | 国密标准,安全 | 国内合规场景必须用 |
1.4 三者的关系与混合使用
实际系统中,很少只靠一种加密手段。你看TLS握手的过程就知道:
- 客户端用非对称加密(RSA或ECDHE)协商出一个临时对称密钥。
- 后续大量数据用对称加密(AES)传输。
- 每条消息附带一个HMAC(基于哈希)确保完整性。
我在做物联网项目时,设备端资源有限,只能跑对称加密。但密钥怎么分发?我们就用非对称加密做一个「安全通道」,把对称密钥下发到设备。而设备上报的数据,会附上SM3哈希值,服务端校验后才知道数据有没有被中间人篡改。你看,三个东西配合起来才完整。