加密基础概念:对称加密与非对称加密的区别、哈希函数、数字签名
聊数据库加密,不能一上来就撸代码。你得先把加密这套东西在心里搭个框架。我见过太多人把加密算法混着用,结果系统的安全策略跟筛子一样。今天咱就从最基础的四个概念开刀。
对称加密:一把钥匙开一把锁
说白了,对称加密就是加密和解密用同一把密钥。想象你有个保险箱,用钥匙锁上,还用同一把钥匙打开。流程很简单:发信方用密钥把明文变成密文,收信方用同样的密钥把密文还原成明文。
我早期做项目时,图省事直接用了 DES。结果呢?安全审计的时候被怼得哑口无言。DES 的密钥长度只有 56 位,现在普通家用电脑跑暴力破解都用不了半天。后来我全部换成了 AES-256,才算踏实。
- 优点:速度快、吞吐量大,适合加密大数据块。我处理数据库表级别加密时首选对称加密。
- 缺点:密钥分发困难。你想想看,如果密钥在传输过程中被截获,整个加密体系就形同虚设。
- 常用算法:AES(推荐)、SM4(国密)、ChaCha20(移动端常用)。
非对称加密:公钥私钥,各司其职
非对称加密就高级一些。它有一对钥匙:公钥和私钥。公钥可以公开,私钥自己死死藏好。用公钥加密的数据,只有对应的私钥能解开;反过来,用私钥签名的数据,任何人都能用公钥验真。
不过要提醒你,非对称加密的性能比对称加密慢好几个数量级。我在线上数据库直接跑 RSA 加密整张表?那是自寻死路。实际项目中,我通常用非对称加密来保护对称密钥——也就是「密钥封装」的思路。
| 对比维度 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1 个 | 2 个(公钥 + 私钥) |
| 计算速度 | 极快(硬件加速后可达 GB/s) | 慢(通常比对称慢 100-1000 倍) |
| 密钥分发 | 困难,需要安全通道 | 容易,公钥可公开传输 |
| 适用场景 | 大数据量加密 | 密钥交换、数字签名、小数据量加密 |
| 代表算法 | AES, SM4, ChaCha20 | RSA, ECC, SM2 |
哈希函数:单向不可逆的「指纹」
哈希函数跟加密不同。加密是双向的,能加密就能解密;哈希是单向的,你把任意长度数据丢进去,吐出一个固定长度的摘要,但从摘要永远推不回原文。
我记得有一次做数据完整性校验,同事问我:「哈希冲突的概率高不高?」我说:「SHA-256 产生哈希冲突的概率比你在路上被陨石砸中还低。」所以放心用。
数据库里哈希最常见的用途有两个:第一是存储密码(一定要加盐!);第二是校验数据有没有被篡改。
- 不要用 MD5 和 SHA-1。这两个已经被证明存在碰撞攻击。我见过有系统还在用 MD5 存密码,简直不敢相信。
- 密码哈希一定要加盐(salt),而且每个用户的盐要随机不同。否则彩虹表分分钟把你的密码库打成筛子。
- 推荐算法:SHA-256 / SHA-3(通用校验),bcrypt / argon2(密码存储)。
数字签名:防抵赖的「电子印章」
数字签名这东西,说白了就是非对称加密的反向应用:用私钥签名,用公钥验签。它能保证数据的完整性和不可否认性。
我做过一个金融级别的数据库审计系统。每次日志写入前,都要对日志内容计算哈希,然后用私钥对这个哈希签名。事后任何人想篡改日志,验签都会失败。这就叫「算改必留痕」。
// Go 语言实现简单数字签名示例
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"fmt"
)
func signMessage(privateKey *rsa.PrivateKey, message []byte) ([]byte, error) {
hashed := sha256.Sum256(message)
signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed[:])
if err != nil {
return nil, fmt.Errorf("签名失败: %w", err)
}
return signature, nil
}
func verifySignature(publicKey *rsa.PublicKey, message []byte, signature []byte) bool {
hashed := sha256.Sum256(message)
err := rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hashed[:], signature)
return err == nil
}
本章知识体系总览
下面这个图把四种概念的关系画出来了。我建议你花两分钟仔细看一遍,脑子里建立起整体架构,后面学具体操作才有方向感。
很多人觉得理解这些就够了,其实不然。真实数据库环境里,你会遇到密钥轮换、加密粒度选择、性能瓶颈这些难题。后面几章我们会一步步拆解。先把今天这四个概念刻进脑子里,它们是你后面调试加密策略、定位安全漏洞的底气。