常见加密算法简介
加密算法这东西,说白了就是给数据加把锁。我这十几年跟数据库打交道,见过太多因为选错算法导致性能崩盘或者安全翻车的案例。今天我把常用的几类算法捋一遍,重点讲它们在列级加密场景里的脾气秉性。
你想想看,给数据库里某个字段加密,跟给网络传输加密还不一样——字段里的数据是静态的,一把锁锁死之后,你可能得频繁地读、写、检索。所以算法的选择直接决定了业务能不能跑得动。
对称加密:快,但钥匙得藏好
对称加密的特点是加解密用同一把密钥。速度极快,适合大批量数据。但问题也明显:密钥怎么安全分发?
- AES(高级加密标准):目前最主流。我记得2010年前后做银行项目,监管强制要求用AES-256,那时候硬件还没现在这么强,加密开销确实不小。现在CPU基本都有AES指令集,性能几乎可以忽略。列级加密我首选AES-256-GCM,自带认证,防篡改。
- DES(数据加密标准):56位密钥,上世纪的东西。现在用一台普通笔记本几小时就能暴力破解。别碰它,真的。
- 3DES(三重DES):DES的加强版,密钥长度168位。但它处理速度慢,而且块大小还是64位,有生日攻击风险。坦白讲,我在2018年的合规审计里见过遗留系统还在用3DES,迁移起来非常痛苦。
| 算法 | 密钥长度 | 块大小 | 速度 | 推荐场景 |
|---|---|---|---|---|
| AES-128 | 128 bit | 128 bit | 极快 | 通用列加密、文件加密 |
| AES-256 | 256 bit | 128 bit | 快 | 金融、政务等高安全列加密 |
| DES | 56 bit | 64 bit | 中等 | 已废弃,不要使用 |
| 3DES | 112/168 bit | 64 bit | 慢 | 遗留系统兼容,逐步迁移 |
我的个人习惯:在MySQL或PostgreSQL里做列级加密,直接用AES-256-GCM。如果数据库支持TDE(透明数据加密),那底层已经是AES了,上层业务不用改。
避坑指南:我曾经接手过一个项目,用AES-ECB模式给身份证号加密。ECB模式对于重复值会产生相同的密文,攻击者一看就知道哪些行是重复的。一定要用GCM或CBC模式。
非对称加密:慢,但能解决信任问题
非对称加密有两个钥匙:公钥公开,私钥自己藏。加解密速度比对称加密慢两到三个数量级。所以不适合直接加密数据库里的大字段,一般用于加密对称密钥,或者做数字签名。
- RSA:最经典的非对称算法。加密时对数据长度有严格限制(最多比密钥长度少几十个字节)。我在做多租户数据隔离时常用RSA:每个租户生成一对密钥,用RSA加密AES的密钥,AES密钥再加密业务数据。这样密钥管理成本低很多。
- ECC(椭圆曲线密码):同等安全强度下,ECC的密钥比RSA短得多。比如256位ECC ≈ 3072位RSA。对于移动端、IoT设备这种算力和存储受限的场景,ECC简直是救星。但SQL层面的列级加密很少直接调用ECC,因为数据库原生支持不如RSA广泛。
| 算法 | 安全性等价密钥长度 | 加密速度 | 典型应用 |
|---|---|---|---|
| RSA-2048 | 112 bit 对称 | 慢 | 密钥交换、数字签名 |
| RSA-4096 | 128 bit 对称 | 很慢 | 高安全签名、根证书 |
| ECC-256 | 128 bit 对称 | 较快 | 移动端证书、TLS握手 |
| ECC-384 | 192 bit 对称 | 中等 | 政府、军事级 |
⚠️ 注意:别拿RSA直接加密数据库里每一行数据!我见过有人把用户手机号用RSA-2048加密存进去,结果一次查询要解密1000行,数据库CPU直接飙到100%。正确做法:用RSA加密AES密钥,AES密钥再加密数据行。
哈希算法:单向,不可逆
哈希不是加密,它是摘要。把任意长度的数据算出一个固定长度的指纹。而且理论上不能从指纹反推出原文。在列级加密场景里,哈希主要用在两个地方:
- 密码存储:存密码的哈希值,不存明文。但注意要用加盐的慢哈希(比如bcrypt、scrypt),单纯SHA-256不够防暴力破解。
- 数据完整性校验:给加密后的数据算个哈希,存到旁边。每次读取时比对,防止篡改。
- SHA-256:输出256位(32字节)。目前广泛使用。我个人的生产经验里,SHA-256的碰撞概率极低,足够日常数据完整性校验。但不要直接用它存密码。
- SHA-3:新一代标准,安全性更高,但软件实现比SHA-256慢不少。数据库原生支持不够多,暂不推荐用于列级加密。
小技巧:如果你想在数据库里做“加密搜索”,可以配合哈希做等值查找。把明文做SHA-256后存成索引列,查询时先对查询值做哈希,匹配索引。当然这样会暴露重复模式,更安全的做法是加随机盐。
该怎么选?我的一点经验
每次做技术选型,我都问自己三个问题:
- 数据是静态还是动态?静态字段(身份证号、手机号)直接用AES-256-GCM。动态交换(比如客户端提交数据到服务端)可以考虑配合非对称加密传key。
- 性能要求多高?如果每秒要加解密几万次,避开非对称。AES配合硬件加速基本不占CPU。
- 合规要求是什么?金融行业通常要求AES-256 + 硬件安全模块。政府项目有时点名要国密SM4,原理跟AES类似。
核心结论:列级加密的主力选手就是AES-256-GCM。非对称加密和哈希算法作为辅助工具,负责密钥管理和完整性校验。别硬要拿RSA扛大流量,也别拿SHA-256当加密用——它压根就不是用来解密的。