第3章 常见加密算法:AES、RSA、ECC、SHA、HMAC
加密算法那么多,该怎么选?
说实话,我刚入行那几年也被各种名字搞晕过。AES、RSA、ECC、SHA… 看上去都像黑话。但做SDK架构,你必须搞明白它们的定位和脾气。
这一章我就把常用的几类算法掰开揉碎讲一遍。顺带说说我在实际项目中踩过的坑。
3.1 对称加密:AES是主力
对称加密,说白了就是加密和解密用同一把钥匙。速度快,适合大量数据。目前业界公认的标准就是 AES(Advanced Encryption Standard)。
AES 有三个变种:AES-128、AES-192、AES-256。数字代表密钥长度,位数越高越难破解。
| 算法 | 密钥长度 | 安全级别(参考) | 性能 |
|---|---|---|---|
| AES-128 | 128 bit | 中等(量子时代前够用) | 最快 |
| AES-256 | 256 bit | 高(抗量子攻击尚可) | 比128慢约20% |
我个人习惯:如果是传输通道加密(如TLS),用AES-128就足够;如果是本地存储密钥加密,或者数据生命周期很长,我会选AES-256。
还要注意工作模式。ECB模式基本被弃用了,因为相同明文块会生成相同密文块,容易泄露模式。CBC模式需要IV(初始化向量),但容易受到填充攻击。建议直接上 GCM(Galois/Counter Mode),它同时提供加密和认证,一次搞定。
我曾经有个项目,刚接手时用的AES-CBC + PKCS7Padding,后来做安全审计发现容易被BEAST攻击。改成GCM之后,代码改动不大,安全性提升一大截。所以一开始就选对模式很重要。
3.2 非对称加密:RSA和ECC的对决
非对称加密用一对钥匙:公钥加密,私钥解密。概念很优雅,但性能比对称加密慢几百倍。所以实际场景中,它只用来加密对称密钥或做数字签名。
3.2.1 RSA:老牌劲旅
RSA基于大整数因子分解的数学难题。密钥长度通常2048位起步,4096位更安全但极慢。
- 加密块大小有限:2048位RSA一次最多加密256字节(还得多余块用于填充)。
- 签名和验签:普遍用于数字证书、代码签名。
- 注意OAEP填充(PKCS#1 v1.5填充有历史漏洞,慎用)。
3.2.2 ECC:后起之秀
ECC(Elliptic Curve Cryptography)用更短的密钥提供同等安全强度。比如256位ECC ≈ 3072位RSA。速度也更快。
常见的曲线:P-256(也叫secp256r1)、Curve25519(X25519用于密钥交换,Ed25519用于签名)。
| 目标安全级别 | RSA密钥长度 | ECC密钥长度 |
|---|---|---|
| 128 bit(中等) | 3072 bit | 256 bit |
| 256 bit(高) | 15360 bit | 512 bit |
你想想看:ECC密钥短,带宽占用小,非常适合移动端或IoT设备。我最近做的跨平台SDK,密钥交换全用的X25519,签名用Ed25519,性能比RSA好太多了。
但是要注意:ECC库的兼容性。有些老旧系统只支持RSA,你要是切到ECC,对方可能验不了签名。所以做多语言SDK时,最好两种都支持,由配置决定。
3.3 哈希算法:SHA-2和SHA-3
哈希不是加密,但它是加密体系里最常用的构件——数据完整性校验、密码存储、消息认证,都离不开它。
SHA-1已经退休了,别再用了。现在安全的底线是SHA-256(属于SHA-2家族)。
SHA-3是最新一代,不需要和SHA-2竞争,它提供的是另一种安全结构(Keccak),目前还没有广泛应用,但值得关注。
我建议:新项目一律用SHA-256。如果特别在意性能,可以选SHA-512/256(它利用64位运算,在64位CPU上更快)。
3.4 HMAC:带钥匙的哈希
HMAC(Hash-based Message Authentication Code)就是用哈希函数结合密钥来验证消息的完整性和真实性。
形式:HMAC-SHA256(key, message)。它比单纯的hash多了一层密钥保护,无法被重放攻击(除非密钥泄露)。
常见的应用:API签名验证、JWT的签名、会话。
使用HMAC时一定要注意密钥的随机性和长度。我见过有人直接用弱密码做HMAC密钥,结果被暴力枚举出来。密钥至少要和输出长度一致(比如HMAC-SHA256就至少32字节随机数)。
3.5 算法关系总览
下面这张图把上面几种算法串起来,你一眼就能看清它们在SDK体系里扮演的角色。
3.6 选型指南
最后给点实战建议。你在设计多语言加密SDK时,可以按这个优先级来:
- 数据加密:对大量数据用AES-256-GCM。别用ECB,别用CBC。
- 密钥交换:用ECC(X25519)。如果兼容性要求极高,退回到RSA-OAEP。
- 数字签名:首选Ed25519(快、小)。其次是ECDSA with P-256,最后才是RSA-PSS。
- 哈希校验:SHA-256,低资源设备用SHA-512/256。
- 消息认证:HMAC-SHA256,密钥必须随机。
记住:没有银弹。每种算法都有一堆参数要选。我建议你建一个算法版本与安全参数对照表,放到SDK的配置文件里,方便在安全标准升级时快速调整。
好了,本章核心算法就这些。第4章我会详细讲如何把这些算法组织成一个可跨语言的加密SDK架构。那才是真正动手的环节。