进入目标站点

步骤一:识别加密

找接口

屏幕截图 2026-03-03 213302.png

找参数

参数名

示例值

推测含义

ts

1772544547612

时间戳(timestamp),通常是毫秒级Unix时间,用于防重放或签名时效性校验。

rs

WKq9IH4BRKbKvbKk

随机字符串(random string),一般用于增加签名的随机性,防止重放攻击。

signature

b7d82065afa26a3cb3f16edb3c32ea434d87894c7900dd53fd409173463627b3a

签名值,通常是对tsrstypepagepage_size等参数按规则加密后的结果,用于接口鉴权。

type

1

业务类型参数,用于区分不同的数据类型或接口分支。

page_size

10

分页大小,即每页返回的数据条数。

page

4

页码,代表请求第4页的数据。

重点:signature 参数同样表现为十六进制字符串,但长度为 64 字符,符合 SHA-256 哈希算法的输出特征:

  • 只包含 0-9 和 a-f,十六进制格式。

  • 长度为 64,符合 SHA-256 输出长度。

因此,我们初步假设 signature 是通过 SHA-256 算法生成的。

步骤二:参数定位

找位置

利用全局搜索找到signature生成的位置

步骤三:参数解析

找逻辑

通过控制台和源代码分析,发现 signature 是通过拼接多个参数(如时间戳、随机字符串等)进行 SHA-256 运算生成的。具体的拼接逻辑如下:

var t = c([d, h, u, e, l, p["type" + e]].sort().join(""));

在这里,c() 函数执行了 SHA-256 哈希运算。

进一步分析参数来源,根据源代码,拼接 signature 的六个参数分别为:

  • d:时间戳 new Date().getTime()

  • h:随机字符串,通过函数生成

  • u:常量字符串 $d6eb7ff91ee257475%

  • e:固定值 1

  • l:固定值 10

  • page:当前页码


通过在控制台打印这些参数并分析源码,我们确认它们的来源和生成方式,并依次写入到本地函数里。

步骤四:参数调用

const CryptoJS = require("crypto-js");

function get_signature(page){
    h = (new Date).getTime()
    m = function(e, t, n) {
            var o = ""
              , i = t
              , r = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
            e && (i = Math.round(Math.random() * (n - t)) + t);
            for (var a = 0; a < i; a++) {
                o += r[Math.round(Math.random() * (r.length - 1))]
            }
            return o
        }(!1, 16)
    _ = "$d6eb7ff91ee257475%"
    e = 1
    d = 10

    data = [h, m, _, e, d, 0, page].sort().join("")
    signature = CryptoJS.SHA256(data).toString()
    return [h,signature]
}