加密基础概念:对称加密与非对称加密的区别、哈希函数、数字签名

聊数据库加密,不能一上来就撸代码。你得先把加密这套东西在心里搭个框架。我见过太多人把加密算法混着用,结果系统的安全策略跟筛子一样。今天咱就从最基础的四个概念开刀。

对称加密:一把钥匙开一把锁

说白了,对称加密就是加密和解密用同一把密钥。想象你有个保险箱,用钥匙锁上,还用同一把钥匙打开。流程很简单:发信方用密钥把明文变成密文,收信方用同样的密钥把密文还原成明文。

我早期做项目时,图省事直接用了 DES。结果呢?安全审计的时候被怼得哑口无言。DES 的密钥长度只有 56 位,现在普通家用电脑跑暴力破解都用不了半天。后来我全部换成了 AES-256,才算踏实。

核心特点:
  • 优点:速度快、吞吐量大,适合加密大数据块。我处理数据库表级别加密时首选对称加密。
  • 缺点:密钥分发困难。你想想看,如果密钥在传输过程中被截获,整个加密体系就形同虚设。
  • 常用算法:AES(推荐)、SM4(国密)、ChaCha20(移动端常用)。
注意:数据库里的对称密钥绝不能硬编码在配置文件里。我曾经见过一个项目,密钥直接写在 application.properties 里,结果代码仓库泄露,几百万条用户数据直接裸奔。密钥必须存放在专用的密钥管理服务(KMS)或硬件安全模块(HSM)中。

非对称加密:公钥私钥,各司其职

非对称加密就高级一些。它有一对钥匙:公钥和私钥。公钥可以公开,私钥自己死死藏好。用公钥加密的数据,只有对应的私钥能解开;反过来,用私钥签名的数据,任何人都能用公钥验真。

不过要提醒你,非对称加密的性能比对称加密慢好几个数量级。我在线上数据库直接跑 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
}

本章知识体系总览

下面这个图把四种概念的关系画出来了。我建议你花两分钟仔细看一遍,脑子里建立起整体架构,后面学具体操作才有方向感。

数据库加密核心概念体系 对称加密 非对称加密 哈希函数 数字签名 效率高 签名/验签 摘要哈希 说明: • 对称加密密钥短,速度最快,用于数据库字段和表级加密 • 非对称加密速度较慢,通常保护对称密钥;数字签名依赖非对称加密和哈希

很多人觉得理解这些就够了,其实不然。真实数据库环境里,你会遇到密钥轮换、加密粒度选择、性能瓶颈这些难题。后面几章我们会一步步拆解。先把今天这四个概念刻进脑子里,它们是你后面调试加密策略、定位安全漏洞的底气。