
一、引言在现代 Web 应用与移动端 App 的登录流程中为防止账号密码等敏感信息在传输过程中被中间人窃听开发者普遍采用 RSA 非对称加密对请求参数进行保护。前端使用服务端下发的公钥对用户名、密码、时间戳等字段加密后再提交服务端持有私钥进行解密校验。RSA 登录参数逆向分析是指通过抓包、调试、代码还原等手段定位加密逻辑、提取公钥参数、复现加密算法最终实现手动构造合法加密请求的过程。本文将从原理、思路、实战、坑点四个维度系统拆解 RSA 登录加密的完整逆向方法论。二、RSA 加密基础与登录场景2.1 RSA 核心原理RSA 是典型的非对称加密算法基于大数分解难题包含公钥n, e与私钥n, d两组参数公钥加密使用公钥对明文进行运算只有对应私钥才能解密私钥签名使用私钥对数据签名公钥可验证签名完整性常见密钥长度1024 位、2048 位目前主流站点均使用 2048 位2.2 登录场景的典型流程客户端请求登录页或接口服务端返回 RSA 公钥通常为 PEM 格式或模数 指数形式前端将明文密码常拼接随机字符串、时间戳、盐值通过公钥加密为密文密文随用户名、验证码等参数一同提交到登录接口服务端用私钥解密密文校验账号密码有效性部分站点会对每次登录生成一次性公钥或公钥与会话绑定增加逆向难度。三、逆向分析整体思路RSA 登录参数逆向的核心目标是找到加密入口 → 提取公钥参数 → 还原明文拼接规则 → 复现加密算法。整体可分为五个阶段阶段一流量抓包与特征识别通过 Charles、Fiddler、Burp Suite 等工具抓取登录请求识别 RSA 密文特征密文通常为固定长度的 Base64 字符串或十六进制字符串2048 位 RSA 加密后 Base64 长度约为 344 字符请求参数名常见为password、pwd、encrypt、rsaPwd、sign等同明文多次加密结果相同ECB 模式 / PKCS1 填充且无随机盐时阶段二前端加密点定位Web 端常用定位方法全局搜索关键词搜索RSA、encrypt、publicKey、JSEncrypt、setPublicKey、MODULUS、publicExponent等关键字XHR/ Fetch 断点在登录接口请求处下断回溯调用栈找到参数组装函数事件监听断点在登录按钮点击事件处下断跟踪表单提交前的加密逻辑Hook 关键函数Hookwindow.btoa、JSON.stringify、XMLHttpRequest.send等在参数提交前拦截查看App 端常用定位方法Jadx 反编译 APK搜索 RSA、encrypt 等关键词Frida Hookjavax.crypto.Cipher类的doFinal方法打印明文与密文定位 so 层加密函数通过 IDA 分析 Native 实现阶段三公钥参数提取RSA 公钥有两种常见呈现形式提取方式不同1. PEM 格式公钥前端代码中直接出现-----BEGIN PUBLIC KEY-----开头的字符串可直接保存使用。2. 模数 指数分离形式代码中以两个变量分别保存modulus/n十六进制或 Base64 编码的大整数exponent/e通常为010001十进制 65537提取后可通过 Python 的Crypto.PublicKey.RSA库构造公钥对象或在线工具转换为标准 PEM 格式。阶段四明文拼接规则还原这是逆向中最容易踩坑的环节。RSA 加密的明文极少是原始密码本身常见拼接方式明文 密码明文 用户名 密码明文 密码 时间戳明文 随机字符串 密码明文 JSON 字符串如{username:xxx,password:xxx,ts:123456789}还原方法在加密函数入口处下断点查看传入加密函数的原始明文参数对比页面输入值即可确认拼接规则。阶段五算法复现与验证使用提取的公钥和明文规则在本地复现加密逻辑将输出结果与抓包结果对比若完全一致说明填充方式、编码方式、明文规则全部正确若每次结果不同但服务端均可通过说明使用了带随机填充的 OAEP 或 PKCS#1 v1.5 填充若本地加密服务端不识别检查公钥格式、字节序、Base64 / 十六进制编码是否匹配四、Web 端实战案例拆解4.1 定位加密函数某站点登录请求中 password 字段为 344 位 Base64 字符串初步判断为 2048 位 RSA。打开 Chrome 开发者工具全局搜索JSEncrypt找到加密库引用在JSEncrypt.prototype.encrypt函数处下断点点击登录断住后查看调用栈回溯到业务层encryptPassword函数4.2 提取公钥参数在断点作用域中查看this.key.n和this.key.en为十六进制大整数共 512 个十六进制字符对应 2048 位e为0x1000165537同时在网络面板中找到/api/getPublicKey接口确认公钥由服务端动态下发有效期为当前会话。4.3 还原明文规则查看 encrypt 函数的入参发现明文格式为password_value | timestamp即密码原文拼接竖线再拼接 13 位毫秒时间戳。4.4 Python 复现代码import base64 import time from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 from Crypto.Util.number import bytes_to_long, long_to_bytes # 提取的模数十六进制 modulus_hex b33a8e... # 省略完整值 exponent 65537 # 构造 RSA 公钥 n int(modulus_hex, 16) rsa_key RSA.construct((n, exponent)) cipher PKCS1_v1_5.new(rsa_key) # 构造明文 password test123456 timestamp str(int(time.time() * 1000)) plain_text f{password}|{timestamp} # 加密并 Base64 编码 encrypted cipher.encrypt(plain_text.encode(utf-8)) encrypted_b64 base64.b64encode(encrypted).decode() print(encrypted_b64)将生成的密文替换抓包参数重放登录成功逆向完成。五、常见变体与逆向难点5.1 填充方式差异PKCS#1 v1.5最常用填充随机数据同明文每次加密结果不同NoPadding明文必须填满密钥长度同明文加密结果固定OAEP安全性更高常见于金融、政务类站点 逆向时若本地加密结果与前端不一致优先排查填充模式。5.2 公钥动态下发部分站点每次刷新页面都会更换公钥且公钥与 session 绑定。此时逆向方案需先请求公钥接口再用返回的公钥加密不能硬编码公钥。5.3 代码混淆与 AST 保护重度混淆的 JS 代码中RSA 实现常被扁平化、字符串加密、控制流混淆。常用破解手段使用 AST 工具如 Babel还原控制流补环境后直接调用混淆后的加密函数内存 Dump 执行中的公钥参数5.4 前端 RSA 后端二次加密部分站点前端 RSA 加密后后端还会进行一次哈希或对称加密存储。逆向只需关注传输层的 RSA 逻辑无需关心服务端后续处理。5.5 分段加密当明文长度超过 RSA 最大加密长度2048 位密钥最大加密 245 字节时会进行分段加密再拼接。逆向时需注意分段顺序、拼接方向、每段填充方式是否一致。六、对抗与反逆向手段站在防御方视角常见的 RSA 加密加固手段包括公钥动态化每次请求生成临时密钥对降低密钥泄露影响前端代码深度混淆加密逻辑打散增加静态分析成本环境检测检测调试器、无头浏览器、Frida 等逆向工具签名校验对整个请求体加签防止参数篡改密钥分片下发公钥拆分为多段前端运行时动态拼接逆向与对抗始终是螺旋上升的过程没有绝对不可破解的前端加密只有成本高低的区别。七、合规与总结RSA 登录参数逆向分析是 Web 安全、爬虫工程、渗透测试领域的基础技能其本质是对前端代码逻辑的还原与复现。本文梳理了从流量分析、加密点定位、公钥提取到算法复现的完整链路并总结了常见变体与难点。合规提示本文所述技术仅用于合法的安全研究与学习交流。未经授权对他人系统进行逆向、重放、批量登录等操作可能违反《网络安全法》及相关法律法规请在授权范围内开展技术研究。掌握 RSA 逆向的核心价值不在于 “破解”而在于理解前端加密的边界与局限从而在系统设计中做出更合理的安全选型在攻防对抗中保持清晰的技术判断。