B站模拟登录JS逆向实战:RSA加密与极验点选验证码破解全流程
Bilibili登录系统采用RSA保护password参数,并集成极验点选验证码。本文通过浏览器调试分析页面请求、拆解RSA加密逻辑以及w参数构造方法,结合原理讲解和代码示例,展示模拟登录实现思路。同时补充JS逆向基础、调试技巧与实际优化方案,帮助开发者高效掌握相关技术。
登录逆向的起点:为什么需要分析B站页面
Bilibili作为国内主流视频平台,其网页登录流程设计得相当严谨。开发者在做自动化脚本、测试工具或者数据采集时,往往需要模拟用户登录行为。这里面涉及前端JavaScript对敏感参数的加密处理,以及验证码的安全校验。直接抓包会发现很多参数看起来随机且复杂,比如password经过加密,验证码请求里还带有一个特殊的w值。这些都是为了防止自动化攻击而设计的。

JS逆向本质上就是把这些前端加密逻辑还原出来,让我们的程序能生成服务器认可的参数。整个过程需要耐心调试,但一旦掌握,就能轻松实现模拟登录。对于小白来说,先理解浏览器开发者工具的使用是关键,按F12打开网络面板,刷新登录页,就能看到一系列XHR请求。这一步能快速定位关键接口,比如combine接口会返回gt、challenge、key等参数,这些后续都要用到。

页面请求详解:从combine到验证码获取

打开登录页https://passport.bilibili.com/login后,刷新页面,网络面板里会出现combine请求。这个请求携带了gt、challenge和key参数。gt是极验的公钥标识,challenge是本次验证码的挑战值,key则用于后续加密。这些参数是服务器生成的,每次请求可能不同,必须实时获取。

点击登录按钮后,会触发验证码请求。这里返回的数据包含c、s两个值,以及pic图片链接。c和s是后续构造w参数的关键材料。对于点选验证码类型,初始请求的w可以传空字符串,因为此时主要是在获取验证码素材。服务器返回的validate字段是校验成功后的凭证,需要和challenge一起拼到登录请求里。

登录主请求则需要password、key、challenge和validate四个核心参数。password是用户输入的明文经过RSA加密后的结果,key来自前面,challenge和validate来自验证码校验。搞清楚这些参数的来源和生成方式,就等于打开了模拟登录的大门。

RSA加密原理与password参数破解

RSA是一种非对称加密算法,公钥用于加密,私钥用于解密。B站前端使用JSEncrypt库来实现password的加密。我们在登录JS文件中搜索password关键字,就能定位到加密函数。找到后可以把相关代码扣取下来,本地搭建环境运行。

var window = global;
var navigator = {};
window['navigator'] = navigator;
// 扣取的JSEncrypt核心逻辑,简化后可直接调用
// 示例:加密函数
function encryptPassword(pwd, pubKey) {
var encrypt = new JSEncrypt();
encrypt.setPublicKey(pubKey);
return encrypt.encrypt(pwd);
}
实际操作中,先把login开头的JS文件下载,删除无关代码,只保留加密部分。添加window和navigator模拟环境,就能本地调试加密结果。公钥通常是固定的字符串,直接从JS里提取即可。这样password参数就成功破解了,无论输入什么密码,都能生成正确的加密串。

RSA的安全性在于大素数分解难度,但前端使用它主要是为了传输安全。理解这个原理后,你会发现很多网站都采用类似方式保护密码,掌握了扣JS的技巧,就能举一反三。

极验点选验证码的w参数构造思路

极验点选验证码要求用户在图片上点击特定文字或图标,客户端会记录点击坐标和轨迹,然后生成w参数。w不是简单拼接,而是经过加密处理的字符串。服务器返回的c和s就是加密所需的材料,通常c是AES密钥相关,s是偏移或初始化向量。

逆向时,需要在JS中找到w的生成函数。常见做法是下断点跟踪加密调用栈,最终定位到AES加密逻辑。构造w的步骤大致是:先把点击位置数据、challenge、validate等信息组装成JSON,然后用c、s作为密钥进行AES-CBC加密,最后base64编码得到w。

// 伪代码示例:w参数构造
function buildW(c, s, clickData, challenge) {
var data = JSON.stringify({
"click": clickData,
"challenge": challenge
});
// 使用AES加密,密钥来自c和s
var encrypted = aesEncrypt(data, c + s);
return base64Encode(encrypted);
}
对于点选场景,点击位置数据需要精确到像素级别,有时还会包含时间戳防重放。整个过程看起来复杂,但通过浏览器断点和控制台一步步跟踪,就能把逻辑还原。掌握后,你会发现极验的其他类型如滑块、无感验证码,核心也是类似的参数加密,只是轨迹数据不同。

模拟登录完整实现步骤与代码示例

把前面分析的参数组合起来,就能写出完整的模拟登录代码。先用requests获取combine参数,然后请求验证码,构造w并提交校验,拿到validate后,再发起最终登录请求。整个流程可以用Python实现,结合execjs运行扣下来的JS加密代码。

关键是处理好会话保持,使用同一个session对象传递cookie。验证码识别如果手动点击太麻烦,实际项目中可以集成图像识别库,或者直接用坐标模拟点击。但最重要的是w参数必须正确,否则服务器会直接拒绝。

# Python模拟登录示例片段
import requests
import execjs
session = requests.Session()
# 获取combine参数...
# ... 省略请求细节
password_enc = js_encrypt(password, pubkey)
# 验证码校验后得到validate
login_data = {
"username": user,
"password": password_enc,
"key": key,
"challenge": challenge,
"validate": validate
}
response = session.post(login_url, data=login_data)
print(response.json())
运行起来后,观察返回的登录态cookie,就能确认模拟成功。实际调试中可能遇到IP风控或者设备指纹检测,这时需要添加代理和随机User-Agent进一步伪装。

逆向调试技巧与常见问题规避

调试JS逆向时,Chrome的Sources面板和断点功能是利器。遇到混淆代码,可以用格式化工具美化。常见问题包括环境缺失导致的undefined错误,这时要补全window、document等全局对象。

- 参数时效性强,gt和challenge必须在几分钟内使用。
- 点击轨迹数据不能太规则,否则容易被识别为机器行为。
- 加密库版本不匹配时,加密结果会出错,建议严格复制原JS逻辑。
多实践几个不同网站的登录逆向,你会发现规律:大部分都依赖RSA或AES,验证码则越来越倾向于行为分析。保持好奇心和动手能力,就能不断进步。

实际业务中的效率优化建议

虽然手动逆向很有成就感,但面对复杂验证码时,重复劳动会消耗大量时间。极验和易盾推出了多种验证模式,包括点选、无感、滑块、文字点选、图标点选、九宫格、五子棋、躲避障碍、空间识别等。如果你的业务需要频繁处理这些,专业的识别平台能提供现成的解决方案。

比如www.ttocr.com就是一个专注于极验和易盾全类型验证码识别的服务平台。它支持API接口调用,企业只需简单注册并传入必要参数,就能实时获取识别结果,无需自己搭建复杂的本地逆向和图像处理流程。对接起来非常便捷,几行代码就能集成到现有系统中,大幅提升开发和运维效率。无论是批量登录还是自动化任务,都能轻松应对,让技术人员把精力集中在核心业务上。



