加密密钥基础:对称密钥、非对称密钥、哈希
做字段级加密,绕不开的就是密钥种类。你想想看,数据保护方案里,密钥是所有安全性的根基。我记得刚入行时,总把“用什么算法”放在第一位,后来踩了几次坑才明白——选错密钥类型,架构再漂亮也白搭。
这一节我们掰开揉碎,讲清楚三类核心密钥:对称密钥、非对称密钥和哈希。它们不是平行的三个概念,而是各自负责不同安全维度的基石。
对称密钥:快,但分发是硬伤
对称密钥,说白了就是一把钥匙开一把锁。加密和解密用同一个密钥。AES、DES、SM4 都是常见算法。我做过一个金融交易系统,字段级加密就用 AES-256-GCM,吞吐量非常高,单条记录加密在微秒级。
优点:速度快,适合大数据量加密。硬件支持好,很多 CPU 有 AES-NI 指令集。
缺点:密钥分发是个大麻烦。如果加密方和解密方不在同一个安全域,怎么把密钥安全传过去?我曾在项目里用对称密钥加密数据库的敏感列,结果密钥硬编码在配置文件中,上线后被扫描工具扫出来——那真是噩梦般的经历。
非对称密钥:慢但安全,专治分发难题
非对称密钥依赖密钥对:公钥公开,私钥私密。RSA 和 ECC 是主流。用它加密,公钥加密的数据只有私钥能解;用它签名,私钥签名的数据公钥一验就知道是谁发的。
我个人的习惯是:需要身份认证或数字签名时,优先选非对称。比如在字段级加密中,可以用 RSA 加密每个业务行的数据密钥(DEK),这样 DEK 分发就安全了——公钥随便给,私钥藏在 KMS 里。
但别指望用它直接加密大段数据。RSA-2048 加密 1KB 数据需要几毫秒,比对称密钥慢上千倍。所以我通常只拿它保护“密钥本身”,或者加密小字段比如身份证号、手机号。
哈希:单向函数,不是加密
很多人把哈希和加密混为一谈,这是个大误区。哈希是单向函数,从哈希值无法还原原文。SHA-256、SM3 都是哈希算法。它不存储密钥,也不给你解密途径。
用在字段级加密的什么地方?
- 完整性校验:对加密后的密文算个哈希,防止数据被篡改。
- 密码存储:存储用户密码的哈希值,而不是明文。注意要加盐。
- 数据去重:对敏感字段计算哈希,用于模糊匹配或索引(但要小心彩虹表)。
注意,哈希不是加密,它是不可逆的。如果你想要加密后还能解密,别用哈希。有一次我被问到“能不能用 SHA-256 加密手机号?”,我告诉他,那就永远解不开了。
三类密码学概念对比
| 特性 | 对称密钥 | 非对称密钥 | 哈希 |
|---|---|---|---|
| 密钥数量 | 1 个 | 2 个(公钥+私钥) | 无密钥 |
| 可逆性 | 可逆(用密钥解密) | 可逆(用私钥解密) | 不可逆 |
| 典型算法 | AES, SM4, ChaCha20 | RSA, ECC, SM2 | SHA-256, SHA-3, SM3 |
| 加密速度 | 非常快(微秒级) | 慢(毫秒级) | 快(哈希运算) |
| 主要用途 | 大数据加密、传输加密 | 密钥交换、数字签名、小数据加密 | 完整性验证、密码存储 |
| 核心挑战 | 密钥分发与存储 | 性能瓶颈 | 彩虹表攻击、冲突风险 |
选型建议:实战中怎么搭
在字段级加密架构里,三种技术经常混合使用。我习惯这样设计:
- 数据加密用对称密钥(AES-256-GCM),每行数据生成一个数据密钥(DEK)。快,且支持身份认证。
- DEK 用非对称密钥加密(RSA-2048),加密后存储。这样只要保护好 RSA 私钥,所有 DEK 都安全。
- 完整性校验用哈希(SHA-256),对密文+认证标签计算哈希,存入另一列。查询时先验哈希,防篡改。
搞清楚了这些基础,后面聊密钥边界划分才能落地。否则光有理论,到真实业务里还是不知道哪把钥匙该放谁手里。