你刚给公司写了个内部数据上传工具,老板问:“这文件传过去真安全?别人截了能解开不?”——这时候,光说“我用了AES”可能不够,得知道用的是AES-128还是AES-256,密钥怎么生成、怎么保管,甚至要不要加个密钥派生函数。别慌,这篇不堆数学公式,只聊实际场景里怎么挑合适的高级加密密钥算法。
先分清两个概念:加密算法 ≠ 密钥管理
很多人一说“加密”,脑子里蹦出RSA、AES这些名字,其实它们分工不同:AES这类是对称算法,速度快,适合加密大量数据;RSA这类是非对称算法,慢但能解决“怎么把密钥安全送过去”的问题。真正影响安全上限的,往往不是算法本身多酷,而是密钥怎么生成、存哪、谁有权碰。
日常开发/个人项目,优先考虑这三组组合
AES-256-GCM + HKDF(推荐指数 ★★★★★)
适用场景:本地笔记加密、网盘客户端、小型SaaS后台的数据落库加密。
理由:AES-256目前没公开实用攻击手段;GCM模式自带完整性校验,防篡改;HKDF能从一个弱口令(比如用户输的密码)安全地派生出强密钥,避免直接拿口令当密钥的硬伤。
简单示例(Python):
import hashlib, os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
# 用户输入的密码和随机盐值
password = b"my-secret-123"
salt = os.urandom(16)
# 用HKDF从密码派生出32字节密钥(AES-256所需)
key = HKDF(
algorithm=hashes.SHA256(),
length=32,
salt=salt,
info=b"aes-256-key",
).derive(password)
# 后续用key初始化AES-GCM加密...
RSA-3072 + OAEP(推荐指数 ★★★★☆)
适用场景:需要“公钥加密、私钥解密”的环节,比如用户用公钥加密登录令牌,服务端用私钥解;或者签名固件包供设备验证。
注意:别用RSA直接加密大文件,它一次最多加密几百字节。常见做法是用RSA加密一个临时AES密钥,再用AES加密正文(即混合加密)。
Ed25519(推荐指数 ★★★★)
适用场景:轻量级签名需求,比如Git提交签名、API请求验签、IoT设备身份认证。
优势:比RSA快得多,密钥短(仅32字节),抗侧信道攻击能力强,而且现在主流语言和库(OpenSSL、libsodium、Python的cryptography)都原生支持,不用自己啃RFC。
这些坑,踩过的人已经哭了
• 别手写RSA密钥生成逻辑——系统熵池不足时可能产出可预测密钥,直接用OpenSSL或crypto/rand;
• 别把密钥写死在代码里或配置文件中,哪怕加了gitignore;
• 别用MD5/SHA1做密钥派生,它们设计目标就不是防暴力破解;
• 别忽略时间侧信道:用==比较密钥会暴露长度信息,改用hmac.compare_digest()这类恒定时间函数。
一句话选型口诀
加密大量数据 → AES-256-GCM;
需要公钥分发密钥或签名 → RSA-3072+OAEP 或 Ed25519;
用户口令生成密钥 → 一定套HKDF或PBKDF2,迭代次数≥600000;
不确定用哪个 → 先跑通libsodium的secretbox(底层就是XSalsa20+Poly1305),它把密钥管理封装得很干净。