第2章 密码学基础回顾:对称加密、非对称加密、哈希函数、数字签名核心概念
做密码SDK,逃不开这四个老朋友。我每次带新人,第一件事就是把它们四个的关系讲透。说白了,它们就像工具箱里的四把扳手——各有各的用法,混着用才顺手。这一章咱们快速过一遍核心,结合我踩过的坑,给你讲明白。
2.1 对称加密——老派但管用
对称加密,加密和解密用同一把钥匙。就像你家大门,一把钥匙开锁、反锁都行。优点是快,特别快;缺点是密钥怎么安全传给对方,是个头疼事。
常见的算法有 AES、DES、3DES、SM4(国标)。其中 AES 是主流,密钥长度 128/192/256 位。我习惯用 AES-256-GCM,自带认证加密,能防篡改。
- AES (Advanced Encryption Standard):全行业默认,软件硬件都支持
- DES:太老了,56 位密钥现在秒破,别用了
- SM4:中国国家密码标准,国内项目必须用的场景
2.2 非对称加密——公钥私钥的默契
非对称加密,密钥成对出现:公钥公开,私钥自己藏好。加密用公钥,解密用私钥;签名用私钥,验签用公钥。解决了密钥分发问题,但速度慢——比对称加密慢上千倍。
主要算法:RSA、ECC(椭圆曲线)、SM2(国标)。RSA 安全但密钥长(2048 位以上),ECC 同样安全级别下密钥短(256 位左右),效率更高。
| 算法 | 密钥长度(安全级别 128 位) | 运算速度 | 常见用途 |
|---|---|---|---|
| RSA | 3072 位 | 慢(指数级) | 密钥交换、数字签名 |
| ECC (secp256r1) | 256 位 | 较快(椭圆曲线乘) | 移动端、TLS 证书 |
| SM2 | 256 位 | 快(国密优化) | 国密合规项目 |
实际项目中,我一般用 ECDH(基于 ECC 的密钥交换)来协商对称密钥,再用对称加密通信。这样既解决了密钥分发,又保证了性能。
2.3 哈希函数——数据的指纹
哈希函数把任意长度的数据,压缩成固定长度的摘要。它是单向的:从摘要无法反推原文。而且雪崩效应明显——输入改一个比特,输出就面目全非。
常用算法:SHA-2 系列(SHA-256/384/512)、SHA-3、SM3(国标)。MD5 和 SHA-1 已经不安全,别再用了。
# Python 里算个 SHA-256 做个演示
import hashlib
data = b"Hello, Crypto SDK!"
digest = hashlib.sha256(data).hexdigest()
print(digest) # 输出 64 个十六进制字符
我踩过的坑:在分布式存储项目中,用 MD5 做数据分块签名,结果两个不同文件产生了碰撞——虽然概率极低,但真就被我们碰到了。从那以后,我强制团队所有地方都切换到 SHA-256。
2.4 数字签名——防抵赖的利器
数字签名 = 哈希 + 非对称加密。签名者用自己的私钥对消息的哈希加密,任何人用签名者的公钥都能验签。这样既能确认消息来源,又能保证消息未被修改。
标准流程:
- 消息 → 哈希计算 → 哈希摘要
- 签名者用私钥对摘要加密 → 得到签名值
- 发送消息 + 签名值 给接收方
- 接收方计算消息哈希,用公钥解密签名得到另一个哈希,对比——相同即验证通过
常见算法:RSA-PSS、ECDSA、EdDSA、SM2 签名。我建议新项目优先用 Ed25519(基于 Curve25519),速度快、签名小、实现安全,免去很多侧信道攻击的烦恼。
2.5 各技术对比与选型建议
这张图把四个技术的关系画清楚了,方便你以后选型时对照。
最后给你一个快速选型建议表:
| 需求场景 | 推荐技术 | 备注 |
|---|---|---|
| 大数据量加密 | AES-256-GCM | 自带认证,防重放 |
| 密钥交换 | ECDH (X25519) | 前向安全性好 |
| 文件完整性校验 | SHA-256 | 无碰撞压力 |
| 软件签名认证 | Ed25519 或 RSA-PSS | Ed25519 签名更小更快 |
| 国密合规 | SM2 + SM3 + SM4 | 国家密码管理局标准 |