2. 基础概念:对称加密、非对称加密、哈希函数及其在数据库中的应用
这一章我们来聊聊最基础的三样东西:对称加密、非对称加密、哈希函数。说实话,很多人在讲数据库安全时容易跳过这些底层工具,直接去谈策略。但我个人的经验是——不把这些概念嚼透了,后面密钥边界模型根本搭不起来。
2.1 对称加密:又快又简单,但有个硬伤
对称加密,说白了就是加密和解密用同一把钥匙。我刚开始做数据库加密时,第一个想到的也是它——性能好,实现简单。
常见的算法包括:
- AES(Advanced Encryption Standard)—— 现在用得最多的,密钥长度128/192/256位
- DES —— 太老了,别用了,我见过有人还在用,被我一顿劝改成了AES
- SM4 —— 国标,国内项目有时会强制要求
对称加密在数据库里的典型场景:字段级加密。比如客户的身份证号、银行卡号,存入前用AES加密,读取时再解密。
举个例子,MySQL里用AES加密一个字段:
-- 加密
INSERT INTO users (id_card, id_card_enc)
VALUES ('123456', AES_ENCRYPT('123456', 'my_secret_key'));
-- 解密
SELECT AES_DECRYPT(id_card_enc, 'my_secret_key') FROM users;
嗯,这里要注意:密钥如果硬编码在代码里,或者存在配置文件中,等于没加密。我在一个项目里就见过直接把密钥写在SQL脚本里的…… 当时我后背一阵凉。
对称加密的硬伤:密钥分发问题。你和对方怎么安全地共享这把钥匙?如果在网络上明文传,那还不如不加密。这也是为什么后面会引入非对称加密,专门解决这个问题。
2.2 非对称加密:公私钥一对,安全分发
非对称加密有一对密钥:公钥加密,私钥解密。公钥可以随便给别人,私钥自己藏好。
常用算法:
- RSA —— 经典,但密钥长度2048位起,速度慢
- ECC(椭圆曲线) —— 同样安全强度下密钥更短,性能更好
- SM2 —— 国标椭圆曲线算法
但别忘了,非对称加密在数据库里很少直接用来加密大量数据。为什么?因为太慢了。你想想看,每个字段都拿RSA去算一遍,查询响应时间马上爆炸。
我记得一个真实场景:我们当时需要给一批敏感文件加密,业务方坚持用RSA直接加密每个文件。我测了一下,50MB文件加密耗时超过30秒…… 后来改成了混合方案:用AES加密文件,用RSA加密AES密钥。这才是业界标准做法。
数据库中的混合用法:用非对称加密保护对称密钥,对称加密保护实际数据。这其实就是密钥边界模型里“密钥分层”的雏形。
2.3 哈希函数:单向的,不能解密
哈希函数跟加密不一样,它是单向的。你输入任意长度的数据,它给你输出固定长度的摘要。你不能从摘要反推出原文。
常见的哈希算法:
| 算法 | 输出长度(位) | 安全性状态 | 典型用途 |
|---|---|---|---|
| MD5 | 128 | 已破解,不应使用 | 无 |
| SHA-1 | 160 | 已不建议使用 | 无 |
| SHA-256 | 256 | 目前安全 | 数据完整性校验、数字签名 |
| SHA-3 | 可变 | 安全 | 新兴标准 |
| SM3 | 256 | 国标安全 | 国内合规项目 |
哈希在数据库里的应用太广泛了:
- 密码存储:不能存明文密码,存的是密码的哈希值。而且还得加盐(salt),防止彩虹表攻击。我曾经优化过一个老系统,他们用SHA-256直接哈希密码…… 不加盐。我直接跟他们说,这跟明文没什么区别。
- 数据完整性校验:比如你存一个大文件,先算哈希存下来。读取时再算一次,一比对就知道有没有被篡改。
- 去重/索引:把长文本哈希成短值,用来快速判断是否重复,或者做分表路由。
避坑指南:我曾经见过一个团队,用MD5哈希做密码存储,而且还不用盐。结果数据库泄露后,攻击者只用一晚上就把80%的密码还原了。后来我帮他们改成bcrypt(一种慢哈希算法),虽然慢了点,但安全多了。
2.4 三者在数据库安全中的协作关系
搞清楚了每个工具的特点,我们来看看它们怎么配合。下面这一张图,我建议你多看两眼,因为它基本概括了密钥边界模型的核心思想。
你看这张图,从上到下三层。最上面三个基础工具,各自有擅长的领域。中间汇入数据库应用层,最后组合起来支撑密钥边界模型。
简单总结一下:
- 对称加密:速度快,适合加密大量数据,但密钥分发是痛点
- 非对称加密:速度慢,适合加密小数据(比如对称密钥),解决密钥分发
- 哈希函数:不可逆,适合做完整性校验和密码存储
我的建议:在数据库安全设计时,先把这三个概念刻在脑子里。后续讲密钥边界模型时,你会反复用到它们。比如内存里的密钥用对称加密保护?还是用硬件安全模块?这些问题理解了基础才能回答。