· 2 min read
密码学基础:对称加密、非对称加密、摘要算法
密码学
保护用户密码、加密数据传输、签名验签……这些安全机制背后,都离不开密码学算法。对称加密和非对称加密有什么区别?数字签名到底在验证什么?。
密码学是信息安全的基石。理解这些基础概念,才能更好地设计安全系统。
对称加密:同一个密钥
加密和解密使用相同的密钥。
graph LR
A[明文] -->|加密| B[密钥 K]
B -->|加密| C[密文]
C -->|解密| D[密钥 K]
D -->|解密| E[明文]
常见算法
| 算法 | 类型 | 特点 |
|---|---|---|
| SM4 | 分组 | 国产商密标准 |
| AES | 分组 | 国际通用,最广泛 |
| DES | 分组 | 已淘汰,密钥太短 |
| RC4 | 流密码 | 已淘汰,不安全 |
分组模式
/* ECB:相同明文产生相同密文,不安全 */
.mode-ecb { }
/* CBC:最常用,需初始化向量 */
.mode-cbc { }
/* GCM:带认证的加密,推荐 */
.mode-gcm { }
/* CTR:可并行计算,推荐 */
.mode-ctr { }
适用场景
- 数据加密存储
- 大量数据传输
- 速度快,效率高
缺点:密钥分发困难,需要安全通道
非对称加密:公钥私钥
加密用公钥,解密用私钥(或反过来)。
graph LR
A[明文] -->|公钥加密| B[公钥]
B -->|加密| C[密文]
C -->|私钥解密| D[私钥]
D -->|解密| E[明文]
两种用法
1. 公钥加密 → 私钥解密(加密)
A 要发消息给 B:
1. A 用 B 的公钥加密
2. 只有 B 的私钥能解密
3. 即使被截获也无法解密
2. 私钥签名 → 公钥验证(认证)
A 要证明消息是自己发的:
1. A 用自己的私钥对消息签名
2. 任何人都能用 A 的公钥验证
3. 签名成功说明消息确实来自 A
常见算法
| 算法 | 类型 | 特点 |
|---|---|---|
| SM2 | 非对称 | 国产标准,效率高 |
| RSA | 非对称 | 国际通用,密钥长 |
| ECC | 非对称 | 曲线密码,同等安全下密钥更短 |
实际用法:混合加密
// 用非对称加密传递对称密钥
async function encryptMessage(message, recipientPublicKey) {
// 1. 生成随机对称密钥
const symmetricKey = generateRandomKey();
// 2. 用对称密钥加密消息
const encryptedMessage = encryptAES(message, symmetricKey);
// 3. 用接收者的公钥加密对称密钥
const encryptedKey = encryptRSA(symmetricKey, recipientPublicKey);
return { encryptedMessage, encryptedKey };
}
这样既保证了安全性(非对称加密密钥),又保证了效率(对称加密数据)。
摘要算法:数字指纹
将任意长度的数据转换为固定长度的”指纹”。
// 相同输入 → 相同输出
// 不同输入 → 几乎不可能相同输出
hash('hello') // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash('hello') // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash('hello1') // fe5f80e6a1d7d7c3c1e8e5a1b2c3d4e5f6789012345678901234567890abcd
特点
| 特性 | 说明 |
|---|---|
| 单向性 | 无法从摘要反推原始数据 |
| 抗碰撞 | 极难找到两个不同数据有相同摘要 |
| 固定输出 | 输入任意长度,输出固定长度 |
常见算法
| 算法 | 输出长度 | 状态 |
|---|---|---|
| SM3 | 256 位 | 国产标准 |
| SHA-256 | 256 位 | 国际标准 |
| SHA-1 | 160 位 | 已淘汰 |
| MD5 | 128 位 | 已淘汰 |
实际用途
// 1. 密码存储:存摘要,不存明文
const hashedPassword = hashSHA256(userPassword);
database.save(hashedPassword);
// 2. 文件完整性校验
const fileHash = hashFile('document.pdf');
// 对比 hash 值确认文件未被篡改
// 3. 数字签名
const messageDigest = hashSHA256(originalMessage);
const signature = signWithPrivateKey(messageDigest, privateKey);
总结
| 类型 | 用途 | 速度 |
|---|---|---|
| 对称加密 | 数据加密 | 快 |
| 非对称加密 | 密钥交换、签名 | 慢 |
| 摘要算法 | 完整性验证 | 最快 |
实际系统通常是三者的组合:用非对称加密传递对称密钥,用对称加密实际数据,用摘要保证完整性。