密码学基础(一):对称加密与非对称加密的区别,哈希函数的作用与特性
说实话,很多刚入行的朋友一听到「密码学」三个字就头大。我当年也一样,总觉得这是数学家才该操心的事。直到我在一个实际项目里,因为选错了加密方式,导致整个系统的密钥管理彻底失控……嗯,从那以后我才老老实实把基础补上。
这一章咱们就聊聊三个最核心的概念:对称加密、非对称加密、哈希函数。搞懂它们,你就能理解签名验签工具到底在干什么。
对称加密:一把钥匙开一把锁
对称加密,说白了就是加密和解密用同一个密钥。你想想看,就像你家里的大门,用一把钥匙锁上,再用同一把钥匙打开。
它的工作流程很简单:
- 发送方用密钥 K 把明文加密成密文
- 接收方用同一个密钥 K 把密文解密回明文
常见的对称加密算法有这些:
| 算法 | 密钥长度 | 特点 |
|---|---|---|
| AES | 128/192/256 位 | 目前最主流,安全高效 |
| DES | 56 位 | 太老了,别用了 |
| 3DES | 112/168 位 | 过渡方案,性能差 |
| SM4 | 128 位 | 国密标准,国内项目常见 |
核心优势:速度快,适合加密大量数据。
致命短板:密钥怎么安全地传给对方?
我在一个物联网项目里就踩过这个坑。设备和服务端之间用 AES 加密通信,一开始觉得挺完美。结果设备量一上来,几千个设备的密钥分发、更新、销毁……简直是一场噩梦。你想想看,如果密钥在传输过程中被截获,那加密还有什么意义?
我曾经犯过的错:把对称密钥硬编码在客户端代码里。结果 APK 被反编译,密钥直接暴露。从那以后,我再也不敢把密钥放在客户端了。
非对称加密:公钥私钥,各司其职
非对称加密就聪明多了。它用一对密钥:公钥公开,私钥保密。公钥加密的数据只能用私钥解密,私钥加密的数据只能用公钥解密。
这就像什么呢?你做一个信箱,任何人都可以用你的公钥(信箱的投信口)往里塞信,但只有你有私钥(信箱钥匙)能打开取信。
常见的非对称加密算法:
| 算法 | 密钥长度 | 用途 |
|---|---|---|
| RSA | 2048/4096 位 | 加密、签名 |
| ECC | 256 位起 | 更短的密钥,同等安全强度 |
| SM2 | 256 位 | 国密标准,基于椭圆曲线 |
它的核心价值在于解决了密钥分发问题。你不需要事先和对方商量一个共同密钥,直接把公钥扔出去就行。私钥自己保管好,谁都不给。
但代价也很明显——慢。RSA 加密几 KB 的数据还行,要是加密一个几百 MB 的视频文件,那得等到天荒地老。
实际项目中的做法:混合加密。用非对称加密传输对称密钥,然后用对称密钥加密实际数据。既解决了密钥分发问题,又保证了性能。HTTPS 就是这么干的。
对称 vs 非对称:一张图看懂
我画了一张对比图,帮你直观理解两者的区别:
哈希函数:不可逆的指纹
哈希函数跟加密不一样。它没有密钥,也不可逆。你给它一段数据,它返回一个固定长度的摘要。哪怕只改一个比特,摘要就完全变了。
它的三个核心特性:
- 单向性:从哈希值无法反推出原始数据。这是数学上保证的,不是靠算法保密。
- 抗碰撞性:很难找到两个不同的输入,产生相同的哈希值。
- 雪崩效应:输入微变,输出剧变。
常见的哈希算法:
| 算法 | 输出长度 | 安全性 |
|---|---|---|
| MD5 | 128 位 | 已破解,别用了 |
| SHA-1 | 160 位 | 理论上可碰撞,弃用 |
| SHA-256 | 256 位 | 目前安全,推荐使用 |
| SM3 | 256 位 | 国密标准,国内项目首选 |
我曾经踩过的坑:在密码存储时用了 MD5。结果用户数据库泄露,虽然密码是哈希过的,但彩虹表一查,大部分密码都还原出来了。后来我改用 bcrypt 加盐,才真正放心。
哈希在签名验签中的角色
你可能会问:哈希跟签名验签有什么关系?关系大了。
签名验签的核心流程是这样的:
- 对原始数据做哈希,得到摘要
- 用私钥对摘要加密,得到签名
- 验证时,用公钥解密签名,得到摘要 A
- 对原始数据做哈希,得到摘要 B
- 比较 A 和 B,一致则签名有效
为什么要先哈希再签名?直接加密原始数据不行吗?
当然可以,但效率太低了。非对称加密很慢,如果原始数据有几百 MB,加密一次得等半天。哈希之后,数据变成固定长度的摘要(比如 32 字节),再对这个摘要签名,又快又安全。
一句话总结:哈希函数是签名验签的「压缩器」,把任意长度的数据压缩成固定长度的指纹,然后用非对称加密对这个指纹签名。
三种技术的协作关系
我再用一个流程图,帮你理清这三者在签名验签中的协作关系:
你看,整个流程里,哈希函数负责压缩和防篡改,非对称加密负责身份认证。两者缺一不可。
我的个人习惯:在项目里,我一般用 SHA-256 做哈希,用 ECC 做签名。ECC 的密钥比 RSA 短很多,签名速度也快,特别适合移动端和嵌入式设备。