2. 密码学基础回顾:对称加密与非对称加密、哈希函数、数字签名原理
说实话,很多做跨平台集成的同学,最后踩的坑往往不是代码写错了,而是密码学基础没打牢。我见过太多人把「哈希」当「加密」用,或者搞混「签名」和「加密」的顺序。嗯,这一节我们就来把这些概念彻底理清楚。
你想想看,签名验签库的核心就四个东西:对称加密、非对称加密、哈希函数、数字签名。搞懂它们,后面集成什么库都不慌。
核心观点:签名 ≠ 加密。签名是为了防篡改和防抵赖,加密是为了保密。两者目的完全不同,千万别混为一谈。
2.1 对称加密:快,但密钥怎么传?
对称加密,说白了就是加密和解密用同一把钥匙。就像你用一把锁锁住箱子,再用同一把钥匙打开它。
常见的算法有:
- AES(Advanced Encryption Standard)—— 目前最主流,我项目里90%的场景都用它
- DES —— 太老了,密钥只有56位,现在基本不推荐
- SM4 —— 国密标准,国内项目必须支持
对称加密最大的优点就是 快。加密大文件、视频流、数据库字段,首选对称加密。但它的痛点也很明显——密钥怎么安全地传给对方?
我的经验:我曾经在一个物联网项目里,设备和服务端用预置的AES密钥通信。结果有一次密钥泄露,所有设备的数据都得重新换密钥。那叫一个折腾。后来我学乖了,密钥分发一定要用非对称加密来保护。
| 算法 | 密钥长度 | 速度 | 安全性 | 推荐场景 |
|---|---|---|---|---|
| AES | 128/192/256 bit | 快 | 高 | 通用加密、文件加密 |
| SM4 | 128 bit | 快 | 高 | 国密合规场景 |
| DES | 56 bit | 中等 | 低(已破解) | 不推荐使用 |
2.2 非对称加密:慢,但解决了密钥分发
非对称加密,有一对密钥:公钥和私钥。公钥可以公开,私钥自己藏好。用公钥加密的数据,只有对应的私钥能解开;反过来,用私钥加密的数据,只有对应的公钥能解开。
常见的算法:
- RSA —— 最经典,2048位以上才安全
- ECC(椭圆曲线)—— 更短的密钥达到同等安全强度,移动端首选
- SM2 —— 国密椭圆曲线算法
非对称加密解决了密钥分发问题,但代价是 慢。比对称加密慢几百到上千倍。所以实际项目中,我们通常用非对称加密来传输对称密钥,然后用对称加密来加密实际数据。这叫「混合加密」。
注意:RSA 1024位已经被认为不安全。我在2019年审计过一个老系统,还在用1024位的RSA,我直接建议他们升级到2048位或切换到ECC。别省那点性能,安全第一。
2.3 哈希函数:不是加密,是摘要
哈希函数,很多人叫它「加密哈希」,其实它根本不是加密。加密可以解密,哈希不行。哈希是单向的——你把任意长度的数据扔进去,出来一个固定长度的摘要。而且哪怕原文只改一个比特,摘要就完全不一样。
常见的哈希算法:
- SHA-256 —— 目前最推荐,签名验签标配
- MD5 —— 128位,已被碰撞攻击破解,别用了
- SHA-1 —— 160位,也已不安全
- SM3 —— 国密哈希,256位
哈希的三个核心特性:
- 单向性:从摘要反推原文,计算上不可行
- 抗碰撞性:很难找到两个不同的输入,产生相同的输出
- 雪崩效应:输入微小变化,输出天翻地覆
哈希在签名验签里的作用是什么?很简单——我们不会直接对几百兆的文件做签名,那样太慢了。而是先对文件做哈希,得到一个固定长度的摘要,然后对这个摘要做签名。这样既快又安全。
避坑指南:我曾经遇到一个同事,用MD5做签名前的哈希。我说MD5已经不安全了,他说「只是做摘要,又不是存密码」。结果后来有人构造了碰撞,伪造了签名。从那以后,我所有项目强制要求SHA-256以上。
2.4 数字签名:防篡改、防抵赖
数字签名,是哈希函数和非对称加密的结合。它的流程是这样的:
- 发送方对数据做哈希,得到摘要
- 发送方用 自己的私钥 对摘要加密,得到签名
- 发送方把「数据 + 签名」一起发给接收方
- 接收方对数据做同样的哈希,得到摘要A
- 接收方用 发送方的公钥 解密签名,得到摘要B
- 比较摘要A和摘要B,一致则签名验证通过
为什么这样能防篡改?因为签名是用私钥生成的,只有发送方有私钥。如果有人篡改了数据,接收方重新计算的摘要就和签名里解密出来的摘要对不上。
为什么能防抵赖?因为私钥只有发送方有,只要签名能用发送方的公钥验证通过,发送方就无法否认这个签名是自己生成的。
关键区别:签名用的是「私钥加密、公钥验证」,加密用的是「公钥加密、私钥解密」。千万别搞反了。我面试过不少人,一说到签名就说「用公钥签名」,这是致命的错误理解。
2.5 知识体系总览
下面这张图,把这一节的核心关系都串起来了。我建议你多看几遍,把每个箭头代表的含义记清楚。
2.6 小结:记住这几条
- 对称加密:快,适合加密大数据,但密钥分发是难题
- 非对称加密:慢,适合加密小数据,解决密钥分发问题
- 哈希函数:单向摘要,不是加密,用于数据完整性校验
- 数字签名:哈希 + 非对称加密,先摘要后签名,防篡改防抵赖
我的习惯:每次开始一个新项目,我都会先画一张这样的体系图贴在墙上。团队里谁搞混了概念,直接看图说话。省得每次都要重新解释一遍。