文章总结: 本文分析了B站HTTP412风控机制,发现其并非图形验证码,而是一种基于SHA256哈希碰撞的轻量级算力校验。通过逆向分析Set-Cookie中的JWT结构Token,提取q前缀与r目标值,进行约500万次暴力求解即可绕过验证。文章详细梳理了从触发412到获取新Token通过校验的全流程,为爬虫与逆向研究提供了参考。 综合评分: 90 文章分类: 逆向分析,爬虫,WEB安全
B 站 412 背后藏了什么?一次逆向分析记录
原创
TheWeiJun TheWeiJun
逆向与爬虫的故事
2026年1月26日 09:02 北京
大家好,我是 TheWeiJun。最近在研究 B 站访问过程中遇到的 HTTP 412 风控问题,通过抓包和请求分析,发现其背后并非传统验证码,而是一套基于算力校验的轻量级风控机制。过程中梳理了相关流程和设计思路,觉得挺有意思,简单记录一下研究过程,供感兴趣的朋友参考。
特别声明:本公众号文章只作为学术研究,不作为其他不法用途;如有侵权请联系作者删除。
立即加星标
每月看好文
一、问题背景:为什么会遇到 412?
在使用 浏览器 / requests / aiohttp / scrapy 等方式访问 B 站视频页面时,很多人都会遇到这样一个状态码:
❌ HTTP 412 Precondition Failed
这个状态并不是普通的网络错误,而是 B 站风控系统明确拒绝了你的请求。
📌 表现形式通常有:
- 直接返回 412
- 页面空白 / 跳转失败
- 同一 IP 短时间内频繁触发
#
🔍 412 的本质是什么?
412 = 你被当成“非正常用户”了
B 站在服务端对请求进行了行为判定,例如:
- UA 是否合理
- 请求是否过于频繁
- IP 是否来自数据中心 / 代理
- Cookie / 行为链是否完整
一旦命中规则,就会触发 验证码挑战流程。
二、412 并不直接封禁,而是「挑战你」
很多人以为 412 = 彻底封 IP,其实不是。
👉 412 是一道门槛,不是死刑
当触发 412 时,响应头里会多出一个非常关键的字段:
Set-Cookie: X-BILI-SEC-TOKEN=xxxxx
这个 X-BILI-SEC-TOKEN,就是后续逆向的 核心突破口。
三、从 Set-Cookie 中提取 Token
我们发送指定视频地址请求,并从Cookie中提取指定内容:
def parse_412_token(set_cookie: str): """ 从 Set-Cookie 中提取 captcha token """ try: token = set_cookie.split(';')[0].split(',')[1] return token except Exception: return None
📌 注意点:
- 这个 token 并不是随机字符串
- 它是一个 JWT-like 结构
- 中间段是 Base64 编码的数据
四、Token 解码:真正的验证码参数在这里
Token 的结构大致如下:
xxxx.payload.xxxx
我们关心的是中间的 payload。
def decode_captcha_payload(token: str): """ base64 解密 token 中的 q, r """ base64_text = token.split('.')[1] decrypt_json = json.loads(b64decode(base64_text + "==")) return decrypt_json.get("q"), decrypt_json.get("r")
解码后,可以拿到两个关键字段:
q:计算前缀r:目标哈希值
📌 到这里可以明确一件事:
B 站的 412 并不是图形验证码,而是一个算力验证
五、验证码核心逻辑:暴力但有效
逆向后发现,B 站的验证逻辑本质是:
sha256(q + i) == r
其中 i 是一个非负整数,范围有限。
#
核心求解代码:
def solve_captcha(a, b): def sha256(data: str) -> str: return hashlib.sha256(data.encode()).hexdigest() limit = 0x4C4B40 # 约 500 万 for i in range(limit): if sha256(a + str(i)) == b: return i return None
✔ 没有花指令 ✔ 没有混淆
这更像是一个 “你是不是正常客户端” 的轻量算力验证。
六、提交验证码,换取通行证
计算出结果后,提交给 B 站的校验接口:
CAPTCHA_URL = “https://security.xxxx.com/th/captcha/cc/check”data = { “token”: token, “result”: result}
服务器返回一个新的 token:
{ “message”:”new-sec-token”}
这个 token 需要放进 Cookie:
cookies = {“X-BILI-SEC-TOKEN”: message}
七、完整流程回顾
整个 412 逆向流程如下:
1️⃣ 请求视频页面 2️⃣ 命中 412 3️⃣ 从 Set-Cookie 提取 token 4️⃣ Base64 解码 payload 5️⃣ 暴力计算验证码 6️⃣ 提交结果 7️⃣ 携带新 Cookie 再次请求 8️⃣ ✅ 成功访问页面
本篇分享到这里就结束了,感谢大家的阅读和支持。如果你对爬虫逆向分析、验证码破解及其他技术话题感兴趣,记得关注我的公众号,不错过下一期的更新。我们将继续深入探讨各种技术细节和实用技巧,一起挖掘技术的更多可能性。期待与你在下期文章中再见,一起学习,一起进步!☀️☀️☀️
如果想要获得更多精彩内容可以关注我朋友:
END
作者简介
我是TheWeiJun,有着执着的追求,信奉终身成长,不定义自己,热爱技术但不拘泥于技术,爱好分享,喜欢读书和乐于结交朋友,欢迎扫我微信与我交朋友💕
分享日常学习中关于爬虫及逆向分析的一些思路,文中若有错误的地方,欢迎大家多多交流指正💕
点分享
点收藏
点点赞
点在看
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:逆向与爬虫的故事 TheWeiJun TheWeiJun《B 站 412 背后藏了什么?一次逆向分析记录》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论