对称密钥基本概念
到底什么是“对称密钥”?
说白了,对称密钥就是一把钥匙开一把锁。
加密和解密用同一个密钥。发信人用它加密,收信人也用它解密。简单,粗暴,但高效。
我记得刚入行时,师父跟我说:“对称加密就是两个人约定一个暗号。暗号一样,别人猜不透。” 后来做项目多了,才发现这句话既是真理,也是陷阱。
- 加密密钥 == 解密密钥
- 算法公开,密钥保密
- 运算速度极快(比非对称快千倍以上)
- 适合大量数据加密
对称密钥的“边界”在哪?
很多人以为对称密钥就是“发个密钥过去就行了”。其实最头疼的是密钥怎么安全分发。
你想想看,如果A和B要通信,得先共享一个密钥。但传递密钥的通道如果本身就不安全,那加密还有什么意义?
我曾经在一个物联网项目里踩过坑。设备端和服务器直接用SM4加密通信,密钥写在固件里。结果产品一量产,所有设备的密钥都一样。攻击者拆一台设备,就能解密所有流量…… 嗯,后来我们改成了密钥协商+动态派生。
对称 vs 非对称:谁更厉害?
很多人喜欢把对称和非对称拿来比。其实它们是搭档,不是对手。
| 对比项 | 对称密钥(如SM4) | 非对称密钥(如SM2) |
|---|---|---|
| 密钥数量 | 1个 | 2个(公钥+私钥) |
| 运算速度 | 极快(硬件加速可达Gbps) | 慢(百倍以上差距) |
| 密钥分发 | 困难,需安全通道 | 公钥可公开,私钥自持 |
| 典型用途 | 批量数据加密 | 密钥交换、数字签名 |
| 安全强度(同等长度) | 高(128位密钥 ≈ 3072位RSA) | 依赖数学难题 |
我用一个实际场景说明:你想用SM4加密一个1GB的文件。如果用SM2硬怼,你等半小时可能都算不完。但用SM4,几秒钟搞定。那密钥怎么给?可以用SM2把SM4的密钥加密后传过去,完美配合。
SM4 的对称密钥长什么样?
SM4的密钥长度固定为128位。也就是16个字节。嗯,这里要特别注意:密钥必须是由安全的随机数发生器生成。
我曾经看到有人用“1234567890abcdef”作为SM4密钥…… 这跟没锁门差不多。攻击者只要字典跑一遍就破了。
RAND_bytes() 生成密钥,然后通过 KDF(密钥派生函数)从主密钥派生出工作密钥。这样即使工作密钥泄露,主密钥还在,不至于全军覆没。
另外,SM4的密钥分为:主密钥(长期不变)和工作密钥(会话级)。边界管理里,我们更关注工作密钥的存活周期。
对称密钥的“存活周期”
一个密钥不该永远存在。我建议的边界实践:
- 生成:在受控环境(HSM / 安全飞地)中一次性生成。
- 分发:通过TLS或公钥加密通道传输。
- 使用:限制使用次数或时长,比如每个会话密钥只加密1万条记录。
- 更新:定期轮换(金融系统通常每月一次)。
- 销毁:清零内存,擦除存储,并记录审计日志。
下图展示了我个人习惯的对称加密流程边界:
一个“避坑”提醒
我曾经在一个金融项目里看到,有人把SM4的密钥直接硬编码在Java代码里,还用ProGuard混淆。结果反编译之后就全出来了。那套系统跑了一年多,直到安全审计才发现。
从那以后我做任何国密项目,都坚持两点:
- 密钥永不落地:仅在内存中存在,用完即清零。
- 密钥可追溯:每次使用都记录密钥ID、时间、操作人。
小结
对称密钥不是“用了就安全”,而是“管好了才安全”。SM4的算法本身没毛病,边界管理才是真正考验工程师功底的地方。密钥怎么来、怎么传、怎么用、怎么扔——每个环节都要画清楚边界线。