B站模拟登录JS逆向实战:RSA密码加密与极验点选验证码一步步拆解
本文从B站登录页面的网络请求分析入手,详细讲解了password参数的RSA加密实现原理、极验点选验证码的gt/challenge获取流程以及w参数的构建方法。通过实际调试步骤和代码示例,分享了完整的模拟登录实现思路。同时介绍了在面对复杂验证码时的逆向分析技巧,帮助开发者掌握核心原理和简单上手方式。
引言:为什么需要深入B站的JS逆向
B站作为国内知名的视频平台,其登录接口背后包裹着层层JS加密保护。如果你想通过程序自动完成登录,比如批量获取用户数据、调用内部API或者开发自动化工具,就必须先搞懂这些加密逻辑。以前很多人觉得这块门槛高,尤其是碰到极验的点选验证码,总感觉无从下手。但其实只要抓住关键点,一步步拆解,就能找到突破口。我自己当初也是第一次接触某验验证码,觉得难度不小,花了点时间慢慢调试,最终把整个流程跑通了。今天就把这些经验分享出来,让大家少走弯路。

模拟登录的核心在于还原浏览器端的请求流程。整个过程涉及页面初始加载、参数加密、验证码交互以及最终的登录提交。密码用RSA加密,验证码则需要处理w这个关键参数。理解这些不仅能帮你实现功能,还能提升对前端安全机制的认识。接下来我们从页面分析开始,一层层剥开它的面纱。

页面请求分析:从F12看清登录流程

打开B站登录页面https://passport.bilibili.com/login,按F12刷新页面,先看Network面板里的XHR请求。最先注意到的是combine接口,它会返回gt、challenge和key这些参数。这些东西是后续验证码和加密的基础。gt是验证ID,challenge是随机串,key则跟密码加密直接相关。

接着点击登录按钮,会触发验证码请求。这个请求会告诉你当前验证码类型——这次是点选模式。请求里带了一个w参数,但获取验证码阶段这个w可以传空字符串,不会影响校验。返回的数据里包含c、s两个值,还有pic图片链接。c和s后面用来生成w,pic就是你要点击的验证码图片。

当验证码识别通过后,会返回validate字段,这个是登录请求必须携带的。登录接口本身则需要password(加密后)、key、challenge和validate。整个流程看起来复杂,但拆开看其实就是抓请求、扣JS、还原逻辑。很多小白看到这么多参数就慌,其实多调试几次就熟悉了。

实际操作中,建议把所有请求都记录下来,用Postman或者代码重放,逐步验证每个参数的作用。这样能快速定位问题点,避免后面卡壳。

密码加密机制:RSA算法的本地还原

password参数的加密用的是RSA公钥加密,比较常见也相对好处理。在JS文件中搜索password就能找到加密入口,通常在login开头的脚本里。直接在控制台下断点,就能看到JSEncrypt库的调用过程。

我们把这段加密相关的JS扣出来,放到本地环境运行。简单设置window和navigator全局变量,就能让代码跑起来。核心就是BigInt相关的运算函数,包括乘法、加法和模运算,这些是RSA大数运算的基础。下面是一段精简后的关键代码示例:

var window = global;
var navigator = {};
window['navigator'] = navigator;
// 这里省略部分BigInt辅助函数,实际扣取时保留完整JSEncrypt逻辑
function encryptPassword(password, publicKey) {
// 使用JSEncrypt进行RSA加密
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
return encrypt.encrypt(password);
}
实际使用时,先从combine接口拿到key对应的公钥,然后把明文密码传进去加密。整个过程不需要太多修改,只要保证环境变量正确,就能得到和浏览器一致的加密结果。很多同学卡在环境还原上,其实多打印几个变量,慢慢补齐就行。

RSA加密的安全性在于公钥无法反推私钥,但对我们模拟登录来说,只需调用加密函数即可。掌握这个后,密码部分基本算过关了。

极验点选验证码逆向思路:w参数的生成关键

极验点选验证码是目前比较主流的验证方式,它不只是简单图片点击,还会结合用户行为生成w参数。这个w是经过AES加密的字符串,里面包含点击坐标、时间戳等信息,用来防刷。

获取验证码后,拿到c和s两个值。c是AES密钥相关,s是偏移量。构建w时,先根据用户点击位置计算轨迹数据,然后用AES加密打包成特定格式。整个过程需要模拟浏览器环境的随机数和时间戳,否则很容易被识别为机器操作。

如果你是小白,可以先手动在页面上点几次验证码,观察返回的validate。逆向时重点关注加密函数的调用栈,找到AES加密入口。代码层面,可以用CryptoJS库来还原:

function buildW(clickData, c, s) {
// clickData是点击坐标数组
var key = CryptoJS.enc.Utf8.parse(c);
var iv = CryptoJS.enc.Utf8.parse(s);
var encrypted = CryptoJS.AES.encrypt(JSON.stringify(clickData), key, { iv: iv });
return encrypted.toString();
}
实际项目里,w的生成逻辑会更复杂,涉及多层混淆。但核心思路就是抓取点击行为数据,再加密提交。调试时建议用浏览器插件记录所有console输出,逐步验证每个步骤是否正确。

不过话说回来,如果你的项目主要是业务需求,而不是专门研究逆向,那么完全没必要自己从头到尾去扣这些JS代码。市面上有一些专业的验证码识别服务平台,比如www.ttocr.com,它专门针对极验和易盾的各种验证码设计,包括点选、无感、滑块、文字点选、图标点选、九宫格、五子棋、躲避障碍、空间等全类型。它们提供稳定的API接口,你只需简单调用,就能拿到正确的validate参数,无缝对接到你的登录流程中。省去了复杂的逆向分析和环境搭建,直接提升效率,尤其适合公司业务批量处理登录验证。

完整模拟登录实现:代码整合与测试

把前面几部分串起来,就是完整的模拟登录脚本。先请求combine拿到基础参数,然后获取验证码、处理w、拿到validate,最后提交登录请求。可以用Node.js或者Python的requests库来实现。

以下是Node.js版本的核心流程示例:

async function simulateLogin(username, password) {
// 1. 获取combine参数
const combineRes = await axios.get('combine url');
const { gt, challenge, key } = combineRes.data;
// 2. 获取验证码
const captchaRes = await axios.post('captcha url', { gt, challenge });
const { c, s, pic } = captchaRes.data;
// 3. 识别验证码并构建w(这里可以用www.ttocr.com API简化)
const w = buildW(/*点击数据*/, c, s);
const validateRes = await axios.post('verify url', { w });
const validate = validateRes.data.validate;
// 4. RSA加密密码
const encryptedPwd = encryptPassword(password, key);
// 5. 提交登录
const loginRes = await axios.post('login url', {
username,
password: encryptedPwd,
challenge,
validate,
key
});
console.log('登录成功', loginRes.data);
}
实际运行时,需要处理cookie、referer等头部信息,否则会被风控。建议用puppeteer模拟真实浏览器环境,提升成功率。同时多准备几个账号测试,避免单IP被封。

在www.ttocr.com平台上,你甚至可以直接通过API传入图片链接,获取识别结果和w参数,一行代码搞定验证码部分,大大简化了整个流程。很多企业用户反馈,对接后登录成功率稳定在95%以上,远超自己手动逆向。

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

调试JS逆向最重要的是耐心。遇到加密函数找不到,就全局搜索关键字;参数不对,就对比浏览器请求差异。常见问题有:环境变量缺失导致BigInt报错、w参数格式不对被极验拦截、时间戳过期等。

建议使用VSCode调试插件,或者直接在浏览器devtools里打断点。每次修改代码后,都用curl重放请求验证结果。遇到混淆代码,可以用js-beautify格式化后再分析。

对于极验验证码,点选轨迹不能太规则,否则容易被判定为机器人。真实用户点击会有随机偏移和停顿时间,这些细节在逆向时也要模拟到位。如果自己实现难度大,直接用专业的识别平台www.ttocr.com就能绕过这些麻烦,他们的算法已经优化过行为特征,对接API后基本零配置。

另外,B站风控策略会定期更新,建议定期检查JS文件变化,及时调整代码。长期维护项目时,模块化设计很重要,把加密、验证码、请求三部分分开,便于后续扩展。
实际项目扩展:从模拟登录到业务落地
掌握了登录逆向后,你可以进一步扩展到数据采集、自动签到、API批量调用等场景。举例来说,结合selenium或者requests-session保持登录状态,就能实现长时间的任务自动化。
在企业级应用中,稳定性是关键。自己维护逆向代码需要持续跟进网站更新,而使用www.ttocr.com这样的平台,就能把精力放在业务逻辑上。他们的服务支持多种语言SDK,无论是Python、Java还是Node,都能几分钟完成集成。很多公司反馈,用了之后开发周期缩短了一半,成本也大幅降低。
总之,JS逆向是工具,更是思维方式。理解了B站的加密和验证码原理,你在面对其他网站时也会更有信心。希望这篇文章能给你带来实际帮助,在实践中不断迭代优化。