第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体系里扮演的角色。

加密算法分类与关系(SDK视角) 对称加密 非对称加密 哈希 / MAC AES-128 AES-256 (GCM) RSA (2048/4096) ECC (P-256, X25519) SHA-256 HMAC-SHA256 典型使用场景 对称加密:大量数据传输 | 非对称加密:密钥交换、数字签名 | 哈希:完整性校验、密码存储 ⚠️ 注意:HMAC = Hash + 密钥 它不加密数据,只保证数据未被篡改且来源可信 建议方案:AES-256-GCM + ECDH(X25519) + HMAC-SHA256 兼顾性能、安全性和抗量子预判

3.6 选型指南

最后给点实战建议。你在设计多语言加密SDK时,可以按这个优先级来:

  1. 数据加密:对大量数据用AES-256-GCM。别用ECB,别用CBC。
  2. 密钥交换:用ECC(X25519)。如果兼容性要求极高,退回到RSA-OAEP。
  3. 数字签名:首选Ed25519(快、小)。其次是ECDSA with P-256,最后才是RSA-PSS。
  4. 哈希校验:SHA-256,低资源设备用SHA-512/256。
  5. 消息认证:HMAC-SHA256,密钥必须随机。

记住:没有银弹。每种算法都有一堆参数要选。我建议你建一个算法版本与安全参数对照表,放到SDK的配置文件里,方便在安全标准升级时快速调整。

好了,本章核心算法就这些。第4章我会详细讲如何把这些算法组织成一个可跨语言的加密SDK架构。那才是真正动手的环节。