数据加密基础:对称加密与非对称加密的区别、哈希算法的作用
好,咱们今天聊点实在的。数据加密这东西,说白了就是给信息上把锁。你想想看,CRM系统里存着客户电话、合同金额、甚至还有身份证号——这些要是明文存着,跟把钞票贴墙上有什么区别?
我做了这么多年安全架构,见过太多因为加密没做好翻车的案例。有个客户,CRM数据库被拖库,结果发现密码字段居然是MD5存的……嗯,那场面,我到现在都记得。所以今天咱们把加密这块彻底讲透。
一、对称加密:一把钥匙开一把锁
对称加密,顾名思义,加密和解密用的是同一把密钥。就像你家的门锁,用同一把钥匙锁门、开门。
常见的对称加密算法有:
- AES(高级加密标准)—— 目前最主流,我项目里90%的场景都用它
- DES(数据加密标准)—— 老古董了,密钥只有56位,现在基本不推荐
- 3DES —— DES的加强版,但性能差,也在逐步淘汰
- SM4 —— 国密标准,国内项目必须考虑
核心特点:
- 加密速度快,适合大量数据
- 密钥管理是最大痛点——你想想,如果密钥泄露了,加密就等于白做
我在CRM项目里怎么用的?举个例子,客户上传的附件(合同PDF、身份证照片),这些文件比较大,用对称加密最合适。我一般用AES-256-GCM模式,既加密又带认证,防止数据被篡改。
// 伪代码示例:AES加密客户附件
function encryptFile(fileData, key) {
// 使用AES-256-GCM模式
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
let encrypted = cipher.update(fileData, 'utf8', 'hex');
encrypted += cipher.final('hex');
// 返回加密数据和认证标签
return { encrypted, authTag: cipher.getAuthTag() };
}
⚠️ 避坑指南:我曾经见过一个团队,把AES密钥硬编码在代码里,结果代码被反编译,整个数据库的加密数据全废了。密钥绝对不能写死在代码里!要用密钥管理服务(KMS)或者硬件安全模块(HSM)。
二、非对称加密:公钥私钥,各司其职
非对称加密就聪明多了。它有一对密钥:公钥(公开)和私钥(自己藏好)。公钥加密的数据,只有私钥能解开;反过来,私钥签名的数据,公钥能验证。
你想想看,这解决了什么问题?对称加密里,你要把密钥传给对方,这个过程本身就危险。而非对称加密,公钥随便发,私钥自己留着,安全多了。
常见算法:
- RSA —— 最经典,但密钥越长性能越差,2048位起步
- ECC(椭圆曲线加密)—— 更短的密钥达到同等安全强度,我比较推荐
- SM2 —— 国密椭圆曲线算法
核心特点:
- 安全性高,密钥分发方便
- 性能慢,不适合加密大文件——一般只用来加密对称密钥或做数字签名
实际项目中,我很少直接用非对称加密去加密整个文件。太慢了,不划算。正确的做法是「混合加密」:
- 用对称加密(AES)加密数据
- 用非对称加密(RSA)加密那个对称密钥
- 把加密后的数据和加密后的密钥一起传过去
这样既保证了速度,又解决了密钥分发问题。HTTPS协议就是这么干的,你每天上网都在用。
💡 我的经验:在CRM系统里,用户登录时的密码传输,我建议用非对称加密。前端用公钥加密密码,后端用私钥解密。这样即使网络被监听,攻击者也拿不到明文密码。
三、哈希算法:不是加密,是摘要
很多人把哈希和加密搞混,其实完全不是一回事。哈希算法有个特点:不可逆。你输入任意长度的数据,它给你输出固定长度的摘要。而且,哪怕输入只改一个字符,输出的摘要就完全不一样。
哈希算法的作用,说白了就是「验真」:
- 密码存储 —— 不存明文密码,存哈希值
- 数据完整性校验 —— 文件下载后算个哈希,对比一下就知道有没有被篡改
- 数字签名 —— 先对数据算哈希,再对哈希签名,效率高
常见哈希算法:
| 算法 | 输出长度 | 安全性 | 推荐场景 |
|---|---|---|---|
| MD5 | 128位 | ❌ 已破解,不要用 | 仅用于非安全场景的校验 |
| SHA-1 | 160位 | ⚠️ 有理论攻击,不推荐 | 旧系统兼容 |
| SHA-256 | 256位 | ✅ 安全 | 通用场景,我首选 |
| SM3 | 256位 | ✅ 国密标准 | 国内合规项目 |
| bcrypt/scrypt | 可变 | ✅ 抗暴力破解 | 密码存储专用 |
⚠️ 避坑指南:我曾经审计过一个CRM系统,他们用MD5存密码。我当场就指出问题——MD5彩虹表满天飞,几秒钟就能查出来。后来我帮他们迁移到了bcrypt,加盐(salt)处理,每个用户随机盐值,这样就算数据库泄露,攻击者也很难破解。
四、三种技术怎么选?我给你的建议
好了,三种技术都讲完了。你可能会问:那我到底该用哪个?
我的建议很简单:
- 存密码 → 用哈希(bcrypt或scrypt,加盐)
- 加密数据 → 用对称加密(AES-256-GCM)
- 传输密钥或数字签名 → 用非对称加密(RSA或ECC)
- 混合场景 → 对称加密+非对称加密组合使用
记住一句话:哈希不是加密,加密不是哈希。哈希用来验证完整性,加密用来保护机密性。两者不能互相替代。
嗯,今天就先聊到这儿。下一节咱们讲「密钥管理的最佳实践」,到时候我会分享一个我踩过的坑——密钥轮换没做好,差点导致整个系统瘫痪。到时候细说。