3. 常见加密算法:对称、非对称、哈希

好,咱们来聊聊加密世界里最基础也最核心的三类算法。说白了,搞渗透测试也好,做安全开发也好,这几样东西基本是天天要打交道的。我先捋个大的框架图,然后咱们一个一个掰开讲。

常见加密算法分类体系 常见加密算法分类体系 对称加密 非对称加密 哈希算法 AES DES/3DES RSA ECC MD5 SHA-256 常见应用场景 对称:大数据量加密,速度最快 非对称:密钥交换、数字签名 哈希:完整性校验、密码存储 实战中的组合使用 非对称加密传递对称密钥 → 对称加密传输数据 哈希防篡改 → 非对称签名保证分发身份 三种算法往往一起上,形成完整保护链条

3.1 对称加密:一把钥匙开一把锁

对称加密,加密和解密用的是同一把钥匙。就像你家里的房门钥匙——开门关门都靠它。速度快,适合处理大量数据,但密钥怎么安全交给对方是个麻烦事。

我做过一个移动端的渗透测试项目,对方用了 AES-CBC 模式加密本地数据库。密钥硬编码在 native 层里。嗯,说实话,我当时用 Frida 一把梭就 Hook 到了,直接把密钥打印出来。这里要吸取的教训是:对称加密的安全性完全取决于密钥保管。

常见对称算法对比

算法密钥长度分组大小速度安全性
AES128/192/256 bits128 bits极快高(公认安全)
DES56 bits64 bits快低(已被破解)
3DES112/168 bits64 bits较慢中等(已不推荐)
SM4128 bits128 bits快国标,安全性好

渗透测试要点:

  • 检查密钥是否硬编码在客户端代码或配置文件中
  • 查看是否使用了 ECB 模式(明文块独立,容易被重放攻击)
  • 验证 IV 是否固定或可预测(CBC 模式下 IV 必须随机)
  • 尝试暴力破解弱密钥(比如 DES 的 56 位密钥几小时就能解)

个人习惯:我一般拿到对称加密的请求包,先看看响应有没有类似 {"data":"U2FsdGVkX1..."} 的结构。再抓几个请求对比 IV 和密文的规律。很多人用 AES-ECB 模式还不自知,结果就是每个 block 都能独立解密,你想想看这多危险。

3.2 非对称加密:公钥私钥,各司其职

非对称加密有两把钥匙:公钥公开,私钥保密。用公钥加密的数据,只有私钥能解开;用私钥签名的数据,任何人都可以用公钥验签。解决了对称加密里的密钥分发难题,但速度慢多了——慢到大概只有对称加密的 1/1000。

我在检查一个金融 App 的接口时,发现它用 RSA 加密整个请求体。刚开始觉得挺安全,结果仔细一看——公钥是硬编码在代码里的,而且用的是 1024 位的 RSA。现在 1024 位 RSA 在云上租几台显卡,一周内就能分解。我建议所有新项目至少上 RSA-2048 或者换 ECC。

非对称算法对比

算法安全密钥长度速度主要用途注意事项
RSA2048+ bits较慢加密、签名密钥长,计算消耗大
ECC256+ bits较快加密、签名同等安全下密钥更短
SM2256 bits快加密、签名(国密)国内合规场景首选
DSA2048+ bits慢仅签名不能加密,已属老旧

我曾经踩过的坑:

有次在调一个支付回调接口,对方说用 RSA 签名验证。我写代码逻辑发现怎么验都过不了——折腾半天才发现,对方把签名算法写成了 MD5withRSA,而我用的是 SHA256withRSA。所以务必在接口文档里明确签名算法名称,不然两边对不上,排查起来真能要你命。

渗透测试关键点:

  • 检查公钥是否可被替换或篡改(中间人攻击)
  • 验证签名是否对原始数据进行完整校验(防止签名剥离攻击)
  • 测试是否能通过重放签名包绕过身份验证
  • 检查是否使用了足够长的密钥(RSA 至少 2048,ECC 至少 256)

3.3 哈希算法:单向的“指纹”

哈希算法不是加密——它没有密钥,不可逆。输入任意长度数据,输出固定长度的摘要(比如 256 位)。同一输入得到同一输出,输入稍微改一点点,输出就天翻地覆。它的核心用途是完整性校验和密码存储。

渗透测试的时候我最喜欢看密码存储用的是什么哈希。如果看到 md5(plaintext) 就存进去的,基本可以直接确认高危漏洞——彩虹表一秒钟就撞出来了。正经做法是加盐(salt)并迭代多次,比如 bcrypt 或 argon2。

常见哈希算法

算法输出长度安全性推荐场景
MD5128 bits极低(碰撞攻击已成功)不可用于安全场景(仅校验非对抗性数据)
SHA-1160 bits低(已知碰撞)已废弃
SHA-256256 bits高签名、完整性、密码(搭配 PBKDF2)
SHA-3可定制高新一代标准,逐步推广
SM3256 bits高国密算法,国内合规场景

一个小技巧:在测试接口时如果看到 sign=...×tamp=...,那大概率是拿所有参数按字典序排序后拼上签名密钥,然后做一次哈希。你可以尝试把 timestamp 改成负数或者极大值,看后端有没有做校验——很多前端防篡改,后端根本没验,这就是漏洞。

3.4 三种算法的组合:实战中的护城河

单一算法往往扛不住真实攻击。想想看——你能用对称加密直接传数据,但密钥怎么安全送达?可以用非对称加密先交换对称密钥。那传输过程中数据被篡改了怎么办?再加一层哈希做完整性校验。这就是 HTTPS 的核心原理:非对称交换对称密钥(TLS 握手),对称加密传输数据,MAC(哈希)保证报文完整。

我在某次红蓝对抗中,模拟攻击者截获了一台物联网设备的升级包,发现设备只验证了固件哈希,没验证签名。我直接改掉固件内容,重新计算 SHA-256 哈希放进去,结果设备就「愉快」地升级了我的后门固件。这件事让我深刻理解:哈希只防无意的传输错误,防不了恶意的篡改——一定要配合数字签名。

推荐组合方案:

  • 密钥协商:使用 ECDH + 临时密钥(PFS,前向安全性)
  • 数据传输:AES-256-GCM(带认证加密,同时提供机密性与完整性)
  • 签名:ECDSA 或 Ed25519
  • 密码存储:bcrypt / argon2 或 PBKDF2 + 随机盐

嗯,这一章的内容就到这里。三种算法好比安全工具箱里的三把扳手——什么时候用哪一把,怎么搭配,心里得有数。下次你碰到加密接口,拿这些知识去套,肯定不会一头雾水。