ARTICLE · 1078015
某剪辑软件 API sign签名生成算法逆向分析还原
某剪辑软件 API sign签名生成算法逆向分析还原
阅读须知
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号联系作者立即删除
概述
本文档详细说明了 CapCut 网页 API 用于请求认证的签名生成算法。
API 接口
POST https://www.capcut.cn/签名生成算法
公式
sign = MD5("9e2c|{url_suffix}|{pf}|{appvr}|{device_time}|{tdid}|11ac").toLowerCase()参数说明
9e2c | 9e2c | ||
url_suffix | on_link | /commerce/v1/group/get_group_info_by_invitation_link 提取 | |
pf | 6 | ||
appvr | 1.0.0.1 | ||
device_time | 1778147560 | ||
tdid | |||
11ac | 11ac |
计算示例
输入:
URL: /commerce/v1/group/device_time: 1778147560步骤 1:提取 URL 后缀(最后 7 个字符)
url_suffix = "on_link"步骤 2:构建签名字符串
sign_string = "9e2c|on_link|6|1.0.0.1|1778147560||11ac"步骤 3:计算 MD5 哈希
sign = MD5(sign_string).toLowerCase() = "3bb6d5d0a697aa8e3e11641dab5da6e3"必需的请求头
{ "appid": "324442", "device-time": 1778147560, "sign-ver": "1", "app-sdk-version": "", "appvr": "1.0.0.1", "tdid": "", "accept": "application/json, text/plain, */*", "content-type": "application/json", "sign": "3bb6d5d0a697aa8e3e11641dab5da6e3", "lan": "zh-hans", "pf": 6, "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}源代码位置
签名生成逻辑位于:
index.5b801950.js原始函数(已压缩):
generateSignHeader=function(e){ let{url:t,pf:r,appvr:o,tdid:n}=e; const l=Math.floor((0,i.default)()/1e3); return{ sign:(0,s.default)(`9e2c|${(0,a.default)(t).call(t,-7)}|${r}|${o}|${l}|${n}|11ac`).toLowerCase(), "device-time":l }}还原后的代码:
function generateSignHeader({url, pf, appvr, tdid}) { const deviceTime = Math.floor(Date.now() / 1000); const urlSuffix = url.slice(-7); const signString = `9e2c|${urlSuffix}|${pf}|${appvr}|${deviceTime}|${tdid}|11ac`; const sign = md5(signString).toLowerCase(); return { sign: sign, "device-time": deviceTime };}实现示例
Python 实现
import hashlibimport timedef generate_sign(url, device_time=None, tdid='', pf=6, appvr='1.0.0.1'): """ 生成 CapCut API 签名 参数: url: API URL 路径 device_time: Unix 时间戳(秒),如果为 None 则使用当前时间 tdid: 设备 ID,默认为空字符串 pf: 平台标识符,默认为 6(Web) appvr: 应用版本,默认为 '1.0.0.1' 返回: 包含 'sign' 和 'device-time' 的字典 """ if device_time is None: device_time = int(time.time()) # 提取 URL 最后 7 个字符 url_suffix = url[-7:] # 构建签名字符串 sign_string = f"9e2c|{url_suffix}|{pf}|{appvr}|{device_time}|{tdid}|11ac" # 计算 MD5 哈希并转小写 sign = hashlib.md5(sign_string.encode()).hexdigest().lower() return { 'sign': sign, 'device-time': device_time }# 示例url = '/commerce/v1/group/get_group_info_by_invitation_link'result = generate_sign(url, device_time=1778147560)print(f"签名: {result['sign']}")# 输出: 3bb6d5d0a697aa8e3e11641dab5da6e3免责声明
本报告仅供安全研究和学习目的,请勿用于非法用途。本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号联系作者立即删除