【密码学】对称加密与非对称加密在JS逆向与爆破测试中的应用
一、引言
在现代Web安全测试实践中,密码学技术无处不在,尤其是在涉及用户身份验证、数据传输保护、签名验证等关键安全点上。作为渗透测试人员或红队工程师,我们常常会在诸如JS逆向工程、API接口还原、登录框爆破、参数构造复现等测试场景中,遇到前端或通信层所实现的加密逻辑。
要有效地进行模拟请求、自动化爆破或数据还原,必须具备一定的密码学背景知识,尤其是理解对称加密(Symmetric Encryption)与非对称加密(Asymmetric Encryption)的主要差异、识别方法与典型应用。
本文旨在从实用角度系统介绍两种加密方式的特点、判断方法,以及它们在前端JS逆向与接口爆破中的典型应用案例,避免空谈数学理论,更聚焦于实战分析、识别技巧与攻防对抗。
二、对称加密与非对称加密:实用角度全面对比
1. 对称加密(Symmetric Encryption)
✅ 特点
- 加解密使用相同的密钥(Key),加密与解密过程对称;
- 速度快,计算资源占用少,适合大数据量的快速加解密;
- 需要安全传输密钥给通信对方,是其最大弱点。
🧰 常见算法
- AES(高级加密标准)
- DES/3DES(现已不推荐)
- RC4(已废弃)
- Blowfish、ChaCha20等
🧪 典型前端表现
- 前端存在一段明显的
AES.encrypt(明文, key)
或CryptoJS.AES.encrypt()
; - 加密结果每次一样,说明ECB模式或IV固定;
- 密文体积较小(相对非对称);
- 密文可逆,说明前端可解密。
2. 非对称加密(Asymmetric Encryption)
✅ 特点
- 使用一对密钥:公钥(Public Key)加密,私钥(Private Key)解密;
- 不需要共享私钥,适合非信任环境;
- 计算开销大,不适合加密大数据(通常配合对称加密使用)。
🧰 常见算法
- RSA(最常见)
- ECC(椭圆曲线加密)
- ElGamal、DSA(主要用于签名)
🧪 典型前端表现
- 出现
JSEncrypt().encrypt()
、rsa.encrypt()
、node-forge
等 RSA 调用; - 公钥字符串常以内含
-----BEGIN PUBLIC KEY-----
开头; - 加密结果较长,长度和公钥位数有关(例如2048-bit公钥加密出的密文约为344字节);
- 密文不可逆(在前端无法解密),即“黑盒”加密。
三、实战场景一:JS逆向分析登录加密逻辑
🎯 目标
识别登录请求中的加密机制,复原加密过程,从而实现接口自动化调用或爆破测试。
📜 示例分析
示例请求体(登录请求):
{"username": "admin","password": "U2FsdGVkX1+0sJgxOYd+yQ=="
}
分析步骤
-
密码字段已加密,判断是否可复现:
-
首先复制该密文值多次尝试相同明文:
-
若每次发送相同密码得出的密文都相同,则说明很可能是对称加密 + 固定密钥 + 固定IV(或ECB模式);
-
若每次加密结果都不同,说明可能存在:
- 随机IV + CBC模式;
- 加盐;
- 或者干脆是RSA非对称加密(由于公钥加密不可控)。
-
-
-
通过控制变量法确认加密类型:
-
若存在
CryptoJS.AES.encrypt(plain, key)
:- 检查 key 是静态写死,还是通过接口动态拉取;
- IV 是静态还是动态;
- Base64后缀特征
U2FsdGVkX1+
是 CryptoJS 的 Base64 + Salt 格式。
-
若存在
new JSEncrypt().encrypt()
:- 说明是标准 RSA;
- 密文长度可测(2048-bit 公钥输出 256 bytes Base64);
- 基本无法通过爆破模拟,只能截断或 hook 函数拿明文。
-
-
Hook 常用方法:
-
针对对称加密,可 Hook
CryptoJS.AES.encrypt()
输出:CryptoJS.AES.encrypt = function(data, key, cfg) {console.log("明文:", data);console.log("密钥:", key);return originalEncrypt.apply(this, arguments); };
-
针对非对称加密,可直接 Hook JSEncrypt:
JSEncrypt.prototype.encrypt = function(data) {console.log("加密前:", data);return originEncrypt.call(this, data); };
-
四、实战场景二:判断密文是否为对称加密(爆破前置分析)
🎯 应用背景
在某些接口或加密字段中,你拿到了大量密文样本(如密文密码、Token),你想判断是否能做字典碰撞 / 爆破。
🔍 典型判断技巧
1. 明文与密文是否一一对应
-
相同明文是否总是生成相同密文?
- ✅ 是 → 高概率为对称加密;
- ❌ 否 → 要么加盐/IV随机,要么非对称加密。
2. 密文长度是否随明文长度变化
- 对称加密一般长度随明文增长(每16字节对齐);
- RSA加密时,输出长度恒定,例如2048位RSA加密任意明文都会输出固定长度密文。
3. Base64/Hex 格式判断
- CryptoJS 输出默认为 Base64;
- RSA 加密输出也常为 Base64,但长度更长。
4. 是否存在 IV、Salt、Nonce 等参数在加密中
-
通过抓包观察是否上传多个字段,如:
{"data": "...","iv": "...","salt": "..." }
- 说明存在 CBC 模式或加盐;
- 若能控制 IV/Salt,可部分复现。
五、前端加密实战总结套路(爆破前识别重点)
特征 | 可能的加密方式 | 是否可爆破/还原 |
---|---|---|
密文相同输入 → 输出恒定 | AES固定IV | ✅(可模拟) |
密文长度固定,明文不同 | RSA加密 | ❌(无法还原) |
明文较长 → 密文变化倍增 | AES块加密 | ✅ |
抓包发现有 iv/salt 参数 | AES CBC 或 CryptoJS | ✅(如能还原) |
抓包参数中含公钥字符串 | RSA非对称加密 | ❌ |
前端使用 window.crypto.subtle | Web Crypto API(强加密) | ❌(难以Hook) |
六、爆破攻击中的密码学分析价值
✅ 典型目标
- 验证码绕过:前端验证规则依赖加密字段构造;
- 账号密码爆破:前端加密函数必须复现才能进行有效字典攻击;
- 签名伪造/重放:需要理解加密或签名机制;
⚠️ 注意事项
-
切勿盲目发送密文列表爆破,可能遭遇 WAF、验证码、多因素;
-
若前端加密使用了 RSA 并上送密文,则密码爆破基本无意义(除非 Hook 前端获取明文);
-
对称加密可构造自动化爆破脚本(如Python模拟 CryptoJS AES 加密):
from Crypto.Cipher import AES import base64key = b'1234567812345678' iv = b'1234567812345678' data = 'admin123'.encode('utf-8')cipher = AES.new(key, AES.MODE_CBC, iv) padded = data + b'\x08' * (16 - len(data) % 16) encrypted = cipher.encrypt(padded) print(base64.b64encode(encrypted).decode())
七、攻防对抗建议
👨💻 攻击者视角
- 主动识别加密类型,选择合适的还原或Hook方法;
- 尽量避免暴力破解非对称密文(成本极高);
- 优先关注可控参数、明文暴露点。
🛡️ 防守者建议
- 前端不应暴露加密密钥;
- 尽量使用非对称加密传输敏感参数;
- 加密参数应带时间戳/随机数/签名;
- 服务端校验应加入多因子/限速/WAF。
八、结语
在JS逆向与爆破测试过程中,加密逻辑是最常见也最关键的分析点。对称加密与非对称加密的区别不仅体现在理论上,更重要的是其在工程实现层面对渗透测试策略的影响巨大。
懂密码学,不必钻研数学公式,但必须能根据样本快速判断加密类别、估算可行性、找到还原突破点。只有结合工具 + 分析思维 + 密码学判断逻辑,才能在黑盒测试中有效“打开”被加密的数据通道。