常用加密算法选择:AES、RSA 与 SM4
做列级加密,选哪个算法?
这个问题我几乎在每个项目启动会上都会被问到。说实话,没有银弹。每个算法都有自己的脾气,选错了,要么性能扛不住,要么安全水位不够。今天咱们就把 AES、RSA 和 SM4 这三张牌摊开聊,看看各自强在哪、弱在哪,以及什么场景该翻哪一张。
对称加密:AES 与 SM4
先讲对称加密。说白了,加解密用的是同一把钥匙。这把钥匙得自己保管好,谁拿到谁就能开锁。实用中,列级加密十有八九都落在这类算法上。
AES
AES 是目前全球用得最广的对称加密标准。我记得 2016 年给一个金融核心系统做改造时,全量字段加密就用的 AES-256,跑了一周压力测试,吞吐只掉了 7%。说实话,这个表现相当惊艳。
AES 三大模式
- ECB:不推荐。同样的明文会产生同样的密文,流量分析一眼就能看出规律。
- CBC:常用,但没法并行加解密,对大量列级操作吞吐有限制。
- GCM:我最常用的模式。自带认证,能防篡改,还能并行,适合数据库列级场景。
AES 的优势很明显:硬件加速普遍(大部分 CPU 都有 AES-NI 指令集),生态成熟,不管你是 Java、Python 还是 Go,库都稳定。缺陷是密钥分发你得自己管。
我个人建议:新项目直接用 AES-256-GCM。性能和安全之间平衡得最好。密钥长度就别用 128 了,多出来那点速度不值得在安全上让步。
SM4
SM4 是国家密码管理局发布的对称加密标准。如果你做等保三级或以上项目,或者客户是政务、公安、医疗系统,通常会指名要求用 SM4。坦白讲,我最早接触 SM4 时也有抵触,总觉得它生态不够成熟。但在一个政务云项目跑了一年之后,我发现 SM4 在 Java 和 C 上的性能其实很接近 AES,尤其做了国密改造后,银行核心系统对它的接受度非常高。
注意:SM4 需要额外的国密算法证书和 SDK。我曾经碰过一个项目,因为采购流程没走完,SDK 拖了两个月才下来。如果你的上架时间很紧,一定要先确认好依赖包的可用性。
非对称加密:RSA
RSA 是非对称加密的代表。公钥加密、私钥解密,反过来也能做。跟对称加密最大的不同是,你不用担心密钥在传输中被偷——公钥随便分,私钥自己藏好就行。但代价是慢。非常慢。
几年前我做过一个需求,需要把用户的身份证号在入库前加密。起初同事直接 RSA-2048 一上了之,结果数据库写入延迟飙到 30 毫秒,接口直接就超时了。后来改成交换密钥阶段用 RSA,列级加密主体换回 AES,才把时延压回 2 毫秒以内。这个案例让我记住了:RSA 不适合大批量数据加密,它最适合做密钥交换和数字签名。
如何在列级加密中选
直接给结论——这张表是我根据实战经验整理的选型参考:
| 对比维度 | AES-256-GCM | RSA-2048 | SM4 |
|---|---|---|---|
| 加密类型 | 对称 | 非对称 | 对称 |
| 密钥长度 | 256 位 | 2048 位 | 128 位 |
| 加密速度 | 极快 | 慢 | 快 |
| 硬件支持 | AES-NI 加速 | 多数 CPU 支持 | 需国密芯片或 SSD |
| 安全性 | 极高 | 高 | 满足国密标准 |
| 列级加密场景 | 主力选手 | 仅用于密钥交换 | 国密合规场景 |
| 常见应用 | 列数据加密、日志加密 | 密钥分发、数字签名 | 政务、银行内部系统 |
你想想看,实际落地时逻辑其实很简单:
- 如果你没有国产化合规要求——直接上 AES-256-GCM,稳定、高效、生态好;
- 如果你有等保或国密要求——必须用 SM4,别想着拿 AES 糊弄,过不了测评的;
- 如果你需要安全分发密钥——在主密钥协商阶段用 RSA,拿到 AES 密钥后再切回对称加密。
核心结论:列级加密的主体数据用对称加密。非对称加密只做钥匙交换。国密场景选 SM4,其他场景选 AES-256-GCM。不要犹豫,不要混用。
说实话,我见过最头疼的不是算法选型本身,而是后期密钥管理和审计。选好了算法,下节课咱们就该聊怎么管住这把钥匙了。