夜雨聆风学习资料网

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
URL 路径的最后 7 个字符
‎on_link
从 ‎/commerce/v1/group/get_group_info_by_invitation_link 提取
‎pf
平台标识符
‎6
Web 平台常量
‎appvr
应用版本
‎1.0.0.1
固定版本字符串
‎device_time
Unix 时间戳(秒)
‎1778147560
当前时间
‎tdid
设备 ID
`` (空字符串)
Web 端通常为空
‎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

免责声明

本报告仅供安全研究和学习目的,请勿用于非法用途。本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号联系作者立即删除

相关学习资料