// 红队渗透 · 2025-10-09

【密码学】对称加密与非对称加密在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=="
}

分析步骤

  1. 密码字段已加密,判断是否可复现:

    • 首先复制该密文值多次尝试相同明文:

      • 若每次发送相同密码得出的密文都相同,则说明很可能是对称加密 + 固定密钥 + 固定IV(或ECB模式);

      • 若每次加密结果都不同,说明可能存在:

        • 随机IV + CBC模式;
        • 加盐;
        • 或者干脆是RSA非对称加密(由于公钥加密不可控)。
  2. 通过控制变量法确认加密类型:

    • 若存在 CryptoJS.AES.encrypt(plain, key):

      • 检查 key 是静态写死,还是通过接口动态拉取;
      • IV 是静态还是动态;
      • Base64后缀特征 U2FsdGVkX1+ 是 CryptoJS 的 Base64 + Salt 格式。
    • 若存在 new JSEncrypt().encrypt():

      • 说明是标准 RSA;
      • 密文长度可测(2048-bit 公钥输出 256 bytes Base64);
      • 基本无法通过爆破模拟,只能截断或 hook 函数拿明文。
  3. 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 base64
    
    key = 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逆向与爆破测试过程中,加密逻辑是最常见也最关键的分析点。对称加密与非对称加密的区别不仅体现在理论上,更重要的是其在工程实现层面对渗透测试策略的影响巨大。

懂密码学,不必钻研数学公式,但必须能根据样本快速判断加密类别、估算可行性、找到还原突破点。只有结合工具 + 分析思维 + 密码学判断逻辑,才能在黑盒测试中有效“打开”被加密的数据通道。

原文 https://blog.csdn.net/2301_79518550/article/details/150014435