ESC
开源 3 分钟阅读

开源项目 tiktok-web-signature 完整逆向 TikTok 网页版签名算法

开发者 n1tr00 发布开源项目 tiktok-web-signature,完整逆向了 TikTok 网页版签名算法(SDK 5.3.2),可离线生成有效的 X-Dynosaur、X-Gnarly 和 X-Bogus 签名,实测 TikTok 服务器接受并返回成功响应。项目纯 Python 实现、无外部依赖,可用于数据抓取与自动化,但需注意遵守平台服务条款。

来源:GitHub

TikTok 网页版签名生成器

Stars Forks Issues

完全逆向工程的 TikTok 网页版 API 签名生成器。可生成 TikTok 服务器接受并返回成功响应的有效 X-Gnarly、X-Bogus 和 X-Dynosaur 签名。

已确认可用——使用这些生成器签名的请求,TikTok 会返回 status_code: 0(成功)。

需要签名以外的更多功能?通过一个 REST API 获取主页、粉丝、视频、评论、直播聊天和搜索:Unofficial TikTok API - dev.omar-thing.site

逆向工程算法

本项目包含对 TikTok 网页版签名算法(SDK 版本 5.3.2,构建号 1.0.0.417)的完整逆向工程。

该算法通过以下方式还原:

对生产环境 webmssdk.js 代码包进行去混淆

对基于 ChaCha 的加密实现进行静态分析

在运行时对签名生成过程进行动态追踪

以字节级重建载荷序列化格式

对照 TikTok 线上 API 响应进行验证

结果:本库生成的签名被 TikTok 服务器接受并返回成功响应(status_code: 0)。

功能特性

生成采用 ChaCha20 加密和 FNV-1a 哈希的 X-Dynosaur 签名

生成采用 ChaCha20 加密、MD5 摘要和 PRNG 洗牌的 X-Gnarly 签名

生成 X-Bogus 占位符(兼容旧版)

支持 SDK 版本 5.3.2(构建号 1.0.0.417)

自定义 Base64 字母表编码

纯 Python 实现

轻量且可用于生产环境

无外部 API 调用——全部离线计算

输入固定时结果可确定

生成 TikTok 接受的有效签名

安装 bash

git clone https://github.com/n1tr00-10/tiktok-web-signature.git cd tiktok-web-signature

除 Python 标准库外无其他依赖。

版本

组件 版本 SDK 5.3.2 SCM 版本 1.0.0.417 SCM 子版本 1.0.0.2858 发布构建 1.0.0.417 Slardar SDK 1.16.6

文件 text

tiktok-web-signature/ ├── x_dynosaur.py # X-Dynosaur 生成器 ├── x_gnarly.py # X-Gnarly 生成器 ├── x_bogus.py # X-Bogus 占位符(旧版兼容) └── README.md

用法 X-Dynosaur python

from x_dynosaur import get_x_dynosaur

query = “aid=1988&app_name=tiktok_web&device_platform=web_pc” user_agent = “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36” body = ""

token = get_x_dynosaur(query, user_agent, body) print(token)

X-Gnarly python

from x_gnarly import get_x_gnarly

query = “aid=1988&app_name=tiktok_web&device_platform=web_pc” user_agent = “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36” body = ""

token = get_x_gnarly(query, user_agent=user_agent, body=body) print(token)

携带签名的完整请求 python

import requests from x_dynosaur import get_x_dynosaur from x_gnarly import get_x_gnarly

query = “aid=1988&app_name=tiktok_web&device_platform=web_pc” ua = “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36” body = ""

dynosaur = get_x_dynosaur(query, ua, body) gnarly = get_x_gnarly(query, dynosaur, “”, ua, body)

headers = { “User-Agent”: ua, “X-Dynosaur”: dynosaur, “X-Gnarly”: gnarly, }

resp = requests.get(f"https://www.tiktok.com/api/…?{query}", headers=headers) print(resp.json()) # 使用有效签名时 TikTok 返回成功

可选参数

参数 默认值 说明 timestamp int(time.time()) Unix 时间戳 f8 会话值 32 位会话字段 canvas 2316120563 Canvas 指纹值 envcode 65 环境代码 version “5.3.2” SDK 版本 scm_version “1.0.0.417” SCM 版本 security_flag 0 安全标志 flag_32 0 32 位标志 flag_125 0 125 位标志 url / referer “www.tiktok.com/" 页面 URL proof_result “0” 工作量证明结果 key_words 随机 自定义 ChaCha 密钥(12 个字)

工作原理

两种签名使用相同的基于 ChaCha 的加密算法:

4 个常量:[1196819126, 600974999, 3863347763, 1451689750]

12 个密钥字:由 PRNG 派生

轮数:(sum(key) & 0x0f) + 5

插入位置:(sum(key_bytes) + sum(cipher)) % (len(cipher) + 1)

X-Dynosaur 载荷

56 个字段(标签 0x20 – 0x38),包含:

时间戳、会话值、canvas、envcode

query、body、user-agent 的 FNV-1a 哈希

版本字符串

校验和字段(0x20)

X-Gnarly 载荷

16 个字段(索引 0 – 16),包含:

query、body、user-agent 的 MD5 摘要

时间戳、会话值、canvas

版本字符串

XOR 校验和字段

字段在序列化前会使用以 f8 为种子的 PRNG 进行洗牌。

自定义 Base64 字母表 text

u09tbS3UvgDEe6r-ZVMXzLpsAohTn7mdINQlW412GqBjfYiyk8JORCF5/xKHwacP=

验证

签名已对照 TikTok 线上 API 端点完成验证。携带有效的 X-Dynosaur 和 X-Gnarly 请求头时,TikTok 返回: json

{“maigc”:538051346,“version”:1,“dataType”:8}

从响应中更新的 token:ZKayKXtxB3G8lNt8L8ANOXxIgMRvPSnXFDYM2ocnU8cT5Ojn0UtXjJrO-kIqPSwfnsJx1VcdZkCEg9BZCXiLFL4Mz9BNMCcmIt0-evhDA4QwRnyfSNhKzT4mkdViClma2eBZblxz

Token 验证 HTTP 200

API 响应:{'status_code': 0}

验证结果:{'valid': True, 'status': 0}

新激活的 msToken:ZKayKXtxB3G8lNt8L8ANOXxIgMRvPSnXFDYM2ocnU8cT5Ojn0UtXjJrO-kIqPSwfnsJx1VcdZkCEg9BZCXiLFL4Mz9BNMCcmIt0-evhDA4QwRnyfSNhKzT4mkdViClma2eBZblxz

这证实了逆向工程得到的算法是正确的,签名已被 TikTok 服务器接受。

Token 长度

Token 长度并不固定。根据以下因素在 230–420 个字符之间变化:

载荷内容

字段值(timestamp、canvas、envcode 等)

PRNG 随机性

Base64 填充

这属于正常且符合预期的现象。

常见问题

需要 session ID 吗? 不需要。签名在本地生成,无需身份验证。

这些签名会过期吗? 会。TikTok 会验证签名中嵌入的时间戳。请为每个请求生成新签名。

为什么我的 token 长度与别人的不同? 载荷包含可变长度字段(哈希、时间戳、版本字符串)。不同输入会产生不同长度的输出。

本项目支持哪个版本? SDK 5.3.2,构建号 1.0.0.417。

这些签名真的有效吗? 有效。该算法已完成完整逆向工程,并对照 TikTok 线上 API 响应进行了验证。TikTok 接受这些签名并返回成功。

可以用于自动化吗? 可以,但请始终遵守 TikTok 的服务条款和速率限制。

更新日志 v1.0.0 — SDK 5.3.2

完成 TikTok 网页版签名算法的完整逆向工程

X-Dynosaur 生成器(ChaCha20 + FNV-1a)

X-Gnarly 生成器(ChaCha20 + MD5 + PRNG 洗牌)

X-Bogus 占位符

自定义 Base64 字母表编码

支持 SDK 版本 5.3.2(构建号 1.0.0.417)

已对照 TikTok 线上 API 验证——返回成功响应

免责声明

本项目仅供教育和研究目的使用。它与 TikTok 或字节跳动无任何关联,也未获得其认可或赞助。

请负责任地使用,并遵守 TikTok 的服务条款。作者不对本软件的任何滥用行为负责。

许可证

MIT 许可证——详情见 LICENSE 文件。

致谢

由 n1tr00 制作