常见加密算法简介

加密算法这东西,说白了就是给数据加把锁。我这十几年跟数据库打交道,见过太多因为选错算法导致性能崩盘或者安全翻车的案例。今天我把常用的几类算法捋一遍,重点讲它们在列级加密场景里的脾气秉性。

你想想看,给数据库里某个字段加密,跟给网络传输加密还不一样——字段里的数据是静态的,一把锁锁死之后,你可能得频繁地读、写、检索。所以算法的选择直接决定了业务能不能跑得动。

对称加密:快,但钥匙得藏好

对称加密的特点是加解密用同一把密钥。速度极快,适合大批量数据。但问题也明显:密钥怎么安全分发?

  • AES(高级加密标准):目前最主流。我记得2010年前后做银行项目,监管强制要求用AES-256,那时候硬件还没现在这么强,加密开销确实不小。现在CPU基本都有AES指令集,性能几乎可以忽略。列级加密我首选AES-256-GCM,自带认证,防篡改。
  • DES(数据加密标准):56位密钥,上世纪的东西。现在用一台普通笔记本几小时就能暴力破解。别碰它,真的。
  • 3DES(三重DES):DES的加强版,密钥长度168位。但它处理速度慢,而且块大小还是64位,有生日攻击风险。坦白讲,我在2018年的合规审计里见过遗留系统还在用3DES,迁移起来非常痛苦。
算法密钥长度块大小速度推荐场景
AES-128128 bit128 bit极快通用列加密、文件加密
AES-256256 bit128 bit快金融、政务等高安全列加密
DES56 bit64 bit中等已废弃,不要使用
3DES112/168 bit64 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-2048112 bit 对称慢密钥交换、数字签名
RSA-4096128 bit 对称很慢高安全签名、根证书
ECC-256128 bit 对称较快移动端证书、TLS握手
ECC-384192 bit 对称中等政府、军事级

⚠️ 注意:别拿RSA直接加密数据库里每一行数据!我见过有人把用户手机号用RSA-2048加密存进去,结果一次查询要解密1000行,数据库CPU直接飙到100%。正确做法:用RSA加密AES密钥,AES密钥再加密数据行。

哈希算法:单向,不可逆

哈希不是加密,它是摘要。把任意长度的数据算出一个固定长度的指纹。而且理论上不能从指纹反推出原文。在列级加密场景里,哈希主要用在两个地方:

  1. 密码存储:存密码的哈希值,不存明文。但注意要用加盐的慢哈希(比如bcrypt、scrypt),单纯SHA-256不够防暴力破解。
  2. 数据完整性校验:给加密后的数据算个哈希,存到旁边。每次读取时比对,防止篡改。
  • SHA-256:输出256位(32字节)。目前广泛使用。我个人的生产经验里,SHA-256的碰撞概率极低,足够日常数据完整性校验。但不要直接用它存密码。
  • SHA-3:新一代标准,安全性更高,但软件实现比SHA-256慢不少。数据库原生支持不够多,暂不推荐用于列级加密。

小技巧:如果你想在数据库里做“加密搜索”,可以配合哈希做等值查找。把明文做SHA-256后存成索引列,查询时先对查询值做哈希,匹配索引。当然这样会暴露重复模式,更安全的做法是加随机盐。

常见加密算法分类与核心特点 对称加密 AES-256-GCM DES / 3DES (❌) 非对称加密 RSA-2048 ECC-256 哈希算法(摘要) SHA-256 SHA-3 对称加密:速度快,适合大批量静态数据加密,但密钥分发困难 非对称加密:速度慢,适合密钥交换和数字签名,列加密建议结合AES使用 哈希算法:不可逆,用于密码哈希和完整性校验;不要用SHA-256直接存密码

该怎么选?我的一点经验

每次做技术选型,我都问自己三个问题:

  • 数据是静态还是动态?静态字段(身份证号、手机号)直接用AES-256-GCM。动态交换(比如客户端提交数据到服务端)可以考虑配合非对称加密传key。
  • 性能要求多高?如果每秒要加解密几万次,避开非对称。AES配合硬件加速基本不占CPU。
  • 合规要求是什么?金融行业通常要求AES-256 + 硬件安全模块。政府项目有时点名要国密SM4,原理跟AES类似。

核心结论:列级加密的主力选手就是AES-256-GCM。非对称加密和哈希算法作为辅助工具,负责密钥管理和完整性校验。别硬要拿RSA扛大流量,也别拿SHA-256当加密用——它压根就不是用来解密的。