Back to Blog
· 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

特点

特性说明
单向性无法从摘要反推原始数据
抗碰撞极难找到两个不同数据有相同摘要
固定输出输入任意长度,输出固定长度

常见算法

算法输出长度状态
SM3256 位国产标准
SHA-256256 位国际标准
SHA-1160 位已淘汰
MD5128 位已淘汰

实际用途

// 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);

总结

类型用途速度
对称加密数据加密
非对称加密密钥交换、签名
摘要算法完整性验证最快

实际系统通常是三者的组合:用非对称加密传递对称密钥,用对称加密实际数据,用摘要保证完整性。

相关阅读