4、数据库加密算法:对称加密与非对称加密、常用算法(AES、RSA、SM4)、算法选择原则

加密算法,说白了就是加密和解密的数学规则。你想想看,把数据锁起来是一回事,用什么锁又是另一回事。不同的锁适用于不同的场景。这一章,我们就聊聊数据库加密里最常用的几把“锁”。

我个人习惯把加密算法分成两大类。一类是对称的,一类是非对称的。这两类算法的思路完全不同,应用场景也各有侧重。

4.1 对称加密与AES

对称加密,加密和解密用的是同一把钥匙。你想想看,这像不像你家大门钥匙?锁门和开门用的是同一把。

对称加密最大的优点就是快。特别快。批量加密几GB的数据,它扛得住。

最常见的对称加密算法:AES(Advanced Encryption Standard)。

AES加密,大家喜欢用它来加密数据。分组大小128位,这个固定不变。密钥长度可以选128、192、256位。越长越安全,但也慢一点。

我在项目中遇到过一件事。有一次,一个同事问:“AES-128够不够用?”我当时给他的回答是:就目前的技术水平,AES-128要暴力破解,得用掉地球全人类几百年的算力。够用了。

核心要点:AES-128足以应对绝大多数数据库加密场景。AES-256适合对安全等级要求极高的敏感数据。

常见的AES工作模式:

  • ECB模式:不推荐。相同的明文块会加密成相同的密文块,有信息泄露风险。
  • CBC模式:需要初始化向量。安全性比ECB好得多,但无法并行加密。
  • GCM模式:我最常用的模式。加密同时提供完整性校验,还能防篡改。

伪代码示例:AES-CBC加密

# 伪代码示例:AES-CBC加密
function encrypt_aes_cbc(plaintext, key):
    iv = generate_random_iv(16)  # 初始化向量,每次加密都要不同
    cipher = AES.new(key, AES.MODE_CBC, iv)
    ciphertext = cipher.encrypt(pad(plaintext, 16))
    return iv + ciphertext
我的小建议:实际工程中,强烈推荐AES-256-GCM模式。性能不错,还自带认证。不用额外操心数据完整性。

4.2 非对称加密与RSA

非对称加密就不一样了。它有一对钥匙:公钥和私钥。公钥可以公开,私钥必须保密。

你想想看,这像什么?像一把锁,你给每个人分发锁头(公钥),他们用锁头锁上东西,然后只有你手里的钥匙(私钥)能打开。

非对称加密速度慢,真的慢。相比AES,RSA慢几个数量级。所以在数据库里,我从来不用RSA加密整张表的数据。用不起那个性能。

那RSA用在哪?

  • 密钥交换:用RSA加密AES的密钥,再用AES加密数据。这招叫混合加密。
  • 数字签名:用私钥签名,公钥验签。确保数据来源可信。
  • 小字段加密:比如加密信用卡CVV码、密钥本身这种极短的数据。

我记得有一个项目,团队直接拿RSA加密整行JSON数据。结果数据库写入速度直接崩了。后来改成用RSA加密AES密钥,再用AES加密JSON,性能才恢复正常。

RSA密钥长度,我建议至少用2048位。1024位已经被认定为不安全了。4096位更稳妥,但性能开销会更大。

避坑提醒:千万不要用RSA加密长文本。RSA对明文长度有上限。比如2048位RSA,一次最多加密245字节。数据多了就得分段,非常麻烦。

4.3 国产密码算法SM4

说到SM4,很多人第一反应是“合规”。没错,在国内做政务、金融项目,国密是绕不开的坎。

SM4是对称加密算法,分组大小和密钥长度都是128位。结构上和AES不同,但安全性等级相当。

我在一个政务云项目中用过SM4。那会儿客户要求所有敏感字段必须使用国密算法加密。我们选的就是SM4-CBC模式。说实话,代码写起来和AES没什么大区别,就是调用库不一样。

工程要点:

  • SM4硬件加速芯片现在很成熟。国产服务器基本都支持。
  • SM4的加解密速度相比纯软件实现,比AES略慢一点点,但差距不大。
  • 如果你的系统涉及等保三级、密评,SM4基本是标配。
一句话总结:AES是国际通用标准,SM4是国内合规首选。两者安全性都在同一量级。

4.4 算法选择原则

选择加密算法没有万能答案。你要看业务场景。

我个人总结了几条原则:

  1. 看数据类型:批量数据用对称加密,密钥交换用非对称加密。
  2. 看性能要求:高并发场景优先选AES-GCM,避免使用RSA加密大数据。
  3. 看合规要求:国内政务、金融领域,优先满足国密标准(SM系列)。
  4. 看密钥长度:不要用低于标准的安全参数。AES至少128位,RSA至少2048位。
  5. 看工作模式:不要用ECB。CBC和GCM都行,但我更推荐GCM。

下面这张图,我帮大家梳理了几种算法的关系和适用场景。

数据库加密算法分类与选择 对称加密 非对称加密 AES SM4 RSA 对称加密适用场景 批量数据加密 列级加密/字段加密 高吞吐低延迟需求 非对称加密适用场景 密钥分发/密钥交换 数字签名/身份认证 小字段保密传输 选择原则:批量数据用AES/SM4,密钥交换用RSA,国内合规用SM4

最后,我再强调一点:实际项目中,很少只用一种算法。混合加密才是常态。用RSA或者DH交换AES密钥,然后用AES加密数据。这叫取长补短。

我的个人经验:初期设计时,优先考虑AES-256-GCM。如果涉及合规,额外加上SM4-CBC。不要让非对称加密成为性能瓶颈。记住,RSA只用来加密小数据。
安全底线:永远不要自研加密算法。永远不要直接用密码当密钥。密钥要由密钥管理系统统一生成和托管。这是血的教训。