字段级加密SDK支持哪些加密算法?
说起字段级加密,很多朋友第一反应就是:“到底用哪种算法?”
这个问题其实挺关键的。选错了算法,要么性能扛不住,要么安全等级达不到监管要求。我今天就结合自己踩过的坑,把 SDK 支持的核心算法摊开来讲。
对称加密:主力选手
字段级加密用得最多的就是对称加密。为什么?因为它快啊。你想想,一个表里几千万条记录,每条都要加密,用非对称那性能根本扛不住。
SDK 主要支持两种对称算法:
| 算法 | 密钥长度 | 分组模式 | 典型场景 |
|---|---|---|---|
| AES-256 | 256 位 | GCM / CBC | 姓名、手机号、地址 |
| SM4 | 128 位 | GCM / CBC | 国密合规场景 |
我个人的习惯是:**优先选 AES-256-GCM**。为什么是 GCM 模式?因为它自带认证标签,加密的同时做了完整性校验,说白了就是防篡改。我在项目中遇到过同事用 CBC 模式,结果业务方改了密文长度没发现,解密出来的数据错乱,排查了很久才发现是 CBC 没有认证能力。
💡 小提示:如果客户有国密合规要求,直接切 SM4-GCM。SM4 的性能跟 AES 差不多,密钥协商用 SM2 配套就好。
非对称加密:解决密钥分发难题
字段级加密有个绕不开的问题:对称加密的密钥怎么安全地传递给接收方?
我的做法是用非对称加密来保护对称密钥。SDK 支持 RSA 和 SM2:
- RSA-2048:国际通用,兼容性好。加密少量数据(比如 AES 密钥)的时候,性能可以接受。
- SM2:国标椭圆曲线算法,密钥短但安全性高。比如同样是 256 位密钥强度,SM2 计算量比 RSA 小很多。
⚠️ 注意:千万别用 RSA 直接加密大字段!有一次我看到有人把整段 JSON 用 RSA 加密……解密花了十几秒不说,RSA 还有数据长度限制(2048 位密钥最多加密 245 字节)。
哈希与 HMAC:不能省的最后一道防线
哈希算法在字段级加密里不是主角,但少了它很容易出问题。
- SHA-256:用于生成数据指纹,做数据去重判断。比如“手机号脱敏后是否重复”,我们只存哈希值,不存原文。
- SM3:国密哈希,输出 256 位。合规场景替换 SHA-256。
- HMAC-SHA256:带密钥的哈希。我强烈建议在密文字段上附加一个 HMAC 标签,这样即使密文被篡改,解密前就能检测出来,避免程序崩溃或数据污染。
⚠️ 避坑指南:我曾经在项目里没加 HMAC,结果第三方在传输过程中把密文截断了两位。解密直接报 Padding 异常,线上排查半天才发现是数据被截断了。从那以后我所有字段加密都强制配 HMAC。
如何选择算法?一张表说清楚
| 需求 | 推荐方案 | 理由 |
|---|---|---|
| 保护字段内容 | AES-256-GCM | 兼顾性能与安全 |
| 合规(等保/密评) | SM4-GCM + SM2 | 国密全套 |
| 密钥安全传输 | SM2 或 RSA-2048 | 只加密对称密钥 |
| 数据去重/完整性 | SHA-256 / SM3 | 不可逆,不泄露原文 |
实际接入的注意事项
这里说几条实操经验:
- 密钥单独管理 – 对称密钥不要写在代码里,用 KMS 或密钥管理系统存。
- 算法版本控制 – SDK 里我会保留旧算法兼容逻辑,防止历史数据解不出来。
- 性能基准测试 – 同样加密 100 万条手机号,SM4 比 AES 慢大约 5%,基本可忽略。
- 字段类型适配 – 整数、时间戳可以直接用固定长度加密;字符串建议先序列化再加密,避免长度溢出。
核心结论: 一般的业务场景,无脑选 AES-256-GCM + HMAC-SHA256。遇到国标合规需求,换成 SM4-GCM + SM2 + SM3。记住,算法本身不是瓶颈,密钥管理和完整性校验才是大部分事故的根源。