1. 密码学基础:对称加密与非对称加密的区别、哈希函数的作用、数字签名的概念
各位同学,咱们今天聊点实在的。密码学这东西,听起来高大上,其实说白了就是一套「怎么让秘密只有该知道的人知道」的规矩。我做了这么多年安全,见过太多因为基础概念没搞懂就翻车的案例。今天咱们就把这几个最核心的概念掰开揉碎了讲清楚。
1.1 对称加密:一把钥匙开一把锁
对称加密,顾名思义,加密和解密用的是同一把密钥。就像你家的门锁,用一把钥匙锁上,再用同一把钥匙打开。简单粗暴,效率极高。
我在项目中遇到过不少团队,一开始图省事,直接用对称加密搞定所有通信。嗯,小规模内部系统确实没问题,但一旦密钥需要通过网络传给对方,麻烦就来了——密钥本身怎么安全传输?这就像你把家门钥匙放在门口脚垫下面,安全吗?
核心特点:
- 速度快:适合加密大量数据,比如文件、视频流
- 密钥管理难:每对通信双方都需要一个独立的密钥,n 个人就需要 n*(n-1)/2 个密钥
- 典型算法:AES、DES、3DES、SM4(国密)
你想想看,如果公司有 100 个员工,每个人都要跟其他人加密通信,那就得管理 4950 个密钥。这谁受得了?所以对称加密虽然快,但密钥分发是个大坑。
避坑指南:我曾经见过一个项目,直接把对称密钥硬编码在客户端代码里。结果反编译 APK 后,密钥一览无余。记住:密钥永远不要写死在代码里,尤其是客户端代码。
1.2 非对称加密:公钥私钥,各司其职
非对称加密就聪明多了。它用一对密钥:公钥(公开)和私钥(保密)。公钥加密的数据,只有对应的私钥能解开;反过来,私钥加密的数据,也只有对应的公钥能验证。
这就像什么呢?你做一个带锁的邮箱挂在门口,锁是打开的(公钥),任何人都可以把信塞进去。但只有你有钥匙(私钥)能打开邮箱取信。这样,别人给你发密文,就不需要提前商量密钥了。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1 个(共享密钥) | 2 个(公钥 + 私钥) |
| 加密速度 | 快(适合大数据量) | 慢(比对称慢 100-1000 倍) |
| 密钥分发 | 困难(需要安全通道) | 容易(公钥随便发) |
| 典型算法 | AES, DES, SM4 | RSA, ECC, SM2 |
| 主要用途 | 数据加密 | 密钥交换、数字签名 |
实际项目中,我们很少直接用非对称加密加密大文件。为什么?太慢了。我习惯的做法是「混合加密」:用非对称加密传输一个临时对称密钥,然后用这个对称密钥加密真正的数据。HTTPS 就是这么干的。
1.3 哈希函数:数据的「指纹」
哈希函数,说白了就是把任意长度的数据,压缩成一个固定长度的「摘要」。这个摘要就像人的指纹,理论上不同的数据不会产生相同的哈希值。
哈希函数有几个硬性要求:
- 单向性:从哈希值无法反推出原始数据
- 抗碰撞性:很难找到两个不同数据有相同的哈希值
- 雪崩效应:输入改一个比特,输出完全变样
我的经验:哈希函数最常见的坑是「哈希碰撞」。虽然理论上概率极低,但 MD5 和 SHA-1 已经被证明存在实际碰撞攻击。我现在做项目,哈希至少用 SHA-256,密码存储用 bcrypt 或 Argon2,别再用 MD5 了,求你了。
哈希函数在安全领域无处不在:
- 密码存储:存哈希值,不存明文密码
- 数据完整性校验:下载文件后比对哈希值,看有没有被篡改
- 数字签名:先对数据哈希,再对哈希值签名(后面细说)
1.4 数字签名:谁说「我」说的,而且没改过
数字签名解决两个问题:身份认证和完整性验证。说白了就是「这东西是我发的,而且发完之后没人动过手脚」。
签名过程是这样的:
- 发送方对数据做哈希,得到摘要
- 用发送方的私钥对摘要加密,生成签名
- 把原始数据和签名一起发给接收方
验证过程:
- 接收方用发送方的公钥解密签名,得到摘要 A
- 接收方对收到的数据做哈希,得到摘要 B
- 比较 A 和 B,一致则签名有效
为什么会这样?因为只有持有私钥的人才能生成有效的签名。公钥是公开的,谁都能验证,但伪造不了签名。这就是非对称加密的妙用。
我曾经踩过的坑:有一次做接口签名,团队把签名算法搞反了——用公钥签名,用私钥验证。结果签名谁都能伪造,整个安全体系形同虚设。记住:私钥签名,公钥验签,这个顺序千万别搞错。
1.5 知识体系总览
下面这张图把今天讲的核心概念串起来了。我建议你多看几遍,理清它们之间的关系。
1.6 小结:这些概念怎么串起来用?
讲到这里,你应该能感觉到,这几个概念不是孤立的。实际项目中,它们经常组合使用:
- HTTPS 握手:先用非对称加密交换对称密钥,再用对称加密传输数据,中间用数字证书验证服务器身份
- 代码签名:对代码文件做哈希,然后用开发者的私钥签名哈希值。用户下载后,用公钥验证签名,确保代码没被植入后门
- JWT(JSON Web Token):对 JSON 载荷做签名,保证 token 在传输过程中不被篡改
个人建议:刚开始学的时候,别急着背算法细节。先把这几个概念的关系理清楚——什么时候用对称加密,什么时候用非对称加密,哈希和签名怎么配合。框架搭好了,细节随时可以查。