4、数据库加密算法:对称加密与非对称加密、常用算法(AES、RSA、SM4)、算法选择原则
加密算法,说白了就是加密和解密的数学规则。你想想看,把数据锁起来是一回事,用什么锁又是另一回事。不同的锁适用于不同的场景。这一章,我们就聊聊数据库加密里最常用的几把“锁”。
我个人习惯把加密算法分成两大类。一类是对称的,一类是非对称的。这两类算法的思路完全不同,应用场景也各有侧重。
4.1 对称加密与AES
对称加密,加密和解密用的是同一把钥匙。你想想看,这像不像你家大门钥匙?锁门和开门用的是同一把。
对称加密最大的优点就是快。特别快。批量加密几GB的数据,它扛得住。
最常见的对称加密算法:AES(Advanced Encryption Standard)。
AES加密,大家喜欢用它来加密数据。分组大小128位,这个固定不变。密钥长度可以选128、192、256位。越长越安全,但也慢一点。
我在项目中遇到过一件事。有一次,一个同事问:“AES-128够不够用?”我当时给他的回答是:就目前的技术水平,AES-128要暴力破解,得用掉地球全人类几百年的算力。够用了。
常见的AES工作模式:
- ECB模式:不推荐。相同的明文块会加密成相同的密文块,有信息泄露风险。
- CBC模式:需要初始化向量。安全性比ECB好得多,但无法并行加密。
- GCM模式:我最常用的模式。加密同时提供完整性校验,还能防篡改。
伪代码示例:AES-CBC加密
# 伪代码示例:AES-CBC加密
function encrypt_aes_cbc(plaintext, key):
iv = generate_random_iv(16) # 初始化向量,每次加密都要不同
cipher = AES.new(key, AES.MODE_CBC, iv)
ciphertext = cipher.encrypt(pad(plaintext, 16))
return iv + ciphertext
4.2 非对称加密与RSA
非对称加密就不一样了。它有一对钥匙:公钥和私钥。公钥可以公开,私钥必须保密。
你想想看,这像什么?像一把锁,你给每个人分发锁头(公钥),他们用锁头锁上东西,然后只有你手里的钥匙(私钥)能打开。
非对称加密速度慢,真的慢。相比AES,RSA慢几个数量级。所以在数据库里,我从来不用RSA加密整张表的数据。用不起那个性能。
那RSA用在哪?
- 密钥交换:用RSA加密AES的密钥,再用AES加密数据。这招叫混合加密。
- 数字签名:用私钥签名,公钥验签。确保数据来源可信。
- 小字段加密:比如加密信用卡CVV码、密钥本身这种极短的数据。
我记得有一个项目,团队直接拿RSA加密整行JSON数据。结果数据库写入速度直接崩了。后来改成用RSA加密AES密钥,再用AES加密JSON,性能才恢复正常。
RSA密钥长度,我建议至少用2048位。1024位已经被认定为不安全了。4096位更稳妥,但性能开销会更大。
4.3 国产密码算法SM4
说到SM4,很多人第一反应是“合规”。没错,在国内做政务、金融项目,国密是绕不开的坎。
SM4是对称加密算法,分组大小和密钥长度都是128位。结构上和AES不同,但安全性等级相当。
我在一个政务云项目中用过SM4。那会儿客户要求所有敏感字段必须使用国密算法加密。我们选的就是SM4-CBC模式。说实话,代码写起来和AES没什么大区别,就是调用库不一样。
工程要点:
- SM4硬件加速芯片现在很成熟。国产服务器基本都支持。
- SM4的加解密速度相比纯软件实现,比AES略慢一点点,但差距不大。
- 如果你的系统涉及等保三级、密评,SM4基本是标配。
4.4 算法选择原则
选择加密算法没有万能答案。你要看业务场景。
我个人总结了几条原则:
- 看数据类型:批量数据用对称加密,密钥交换用非对称加密。
- 看性能要求:高并发场景优先选AES-GCM,避免使用RSA加密大数据。
- 看合规要求:国内政务、金融领域,优先满足国密标准(SM系列)。
- 看密钥长度:不要用低于标准的安全参数。AES至少128位,RSA至少2048位。
- 看工作模式:不要用ECB。CBC和GCM都行,但我更推荐GCM。
下面这张图,我帮大家梳理了几种算法的关系和适用场景。
最后,我再强调一点:实际项目中,很少只用一种算法。混合加密才是常态。用RSA或者DH交换AES密钥,然后用AES加密数据。这叫取长补短。