加密算法基础:对称加密、非对称加密、哈希的选择与比较
说到加密算法,我见过不少新人一上来就纠结“哪个算法最安全”。其实说白了,没有完美的算法,只有合适的场景。今天咱们就把三种主流算法掰开揉碎,看看它们各自擅长什么,又该在什么场合用。
对称加密:一把钥匙开一把锁
对称加密的原理很简单——加密和解密用同一个密钥。就像你用一把钥匙锁门,也用同一把钥匙开门。
我最常用的是AES,尤其是AES-256-GCM模式。为什么?因为它在安全性和性能之间平衡得最好。我在处理金融数据时用过AES-256-CBC,但后来发现GCM模式自带认证,省去了额外算MAC的步骤。
常见的对称加密算法对比:
| 算法 | 密钥长度 | 分组大小 | 模式 | 我推荐的使用场景 |
|---|---|---|---|---|
| AES | 128/192/256位 | 128位 | GCM、CBC、CTR | 加密字段索引、文件加密 |
| ChaCha20 | 256位 | 流加密 | Poly1305 | 移动端、低性能设备 |
| 3DES | 168位 | 64位 | CBC | 别用了,算力上已经不安全 |
| SM4 | 128位 | 128位 | CBC、GCM | 国内合规场景 |
非对称加密:公钥私钥两把锁
非对称加密有两个密钥:公钥公开,私钥自己留着。别人用你的公钥加密,只有你能用私钥解密。
为什么需要这种方案?你想啊,对称加密的密钥怎么传给对方?要是密钥在半路被截了,整个加密就废了。非对称加密解决了这个问题——公钥随便传,私钥打死不给别人。
常见的非对称算法有:
- RSA:经典算法,1024位以下已不安全,建议2048位以上。但算起来慢,特别是私钥操作。
- ECC(椭圆曲线):密钥更短,性能更好。256位ECC相当于3072位RSA的安全强度。
- SM2:国密标准,基于ECC,国内合规必须。
实际做法是:用非对称加密传输对称密钥,然后用对称密钥加密实际数据。这叫“混合加密”,TLS就是这么干的。
哈希算法:单向的指纹
哈希算法跟加密不一样。它不是用来“加密-解密”的,而是把任意长度的数据变成固定长度的摘要。而且这个过程不可逆——你没法从摘要反推原文。
我在日志搜索里哈希用得最多。比如你想查某个敏感字段的值,但又不想存明文,那就存它的哈希。搜索的时候,把关键词哈希一下,去匹配哈希值就行。
常用哈希算法:
- SHA-256:目前最安全的通用哈希,输出256位。推荐用于大多数场景。
- SHA-3:新一代标准,结构跟SHA-2完全不同。如果担心SHA-2有后门,可以用它。
- SM3:国密哈希,输出256位。国内合规要求时用。
- MD5/SHA-1:别碰了。MD5的碰撞攻击已经烂大街,SHA-1也在逐渐被淘汰。
存储密码时,千万别只做一次SHA-256。要用bcrypt、scrypt或Argon2——这些是专门的密码哈希函数,故意设计得很慢,暴力破解成本高得吓人。
三种算法的对比
我整理了一份对比表,方便你快速决策:
| 特性 | 对称加密 | 非对称加密 | 哈希算法 |
|---|---|---|---|
| 密钥数量 | 1个 | 2个(公钥+私钥) | 无密钥 |
| 是否有逆操作 | 是(可解密) | 是(可解密) | 否(不可逆) |
| 性能 | 极快 | 极慢 | 较快 |
| 安全性基准 | AES-256 | ECC p-256 / RSA-3072 | SHA-256 |
| 典型用途 | 数据加密、字段索引 | 密钥交换、数字签名 | 数据完整性、密码存储 |
| 密钥管理难度 | 高 | 低(公钥可公开) | 无 |
怎么选?我的建议
这个问题没有标准答案,得看你的具体场景。我归纳了三条原则:
- 要加密还能解密?用对称加密。如果涉及密钥分发,结合非对称加密做密钥交换。
- 只要验证完整性?用哈希。先把原文哈希存好,用的时候重新算哈希对比就行。
- 要数字签名?用非对称加密的私钥签名,公钥验签。
我曾经接到过一个线上问题——某团队用RSA直接加密日志字段,导致插入性能从每秒5000掉到200。为什么不先用AES加密字段,再用RSA加密AES密钥呢?这就是典型的“选错算法”案例。
最后说一句:算法本身只是工具。真正的安全取决于你怎么用它。密钥管理、随机数生成、协议设计……哪一环出问题,算法再强也没用。嗯,这话题后面还会细聊。