11,js逆向(sing的加密)

该文描述了如何使用Python对API调用的sign参数进行解密和验证。文中提到sign是基于(r.token+&+s+&+a+&+n.data)生成,其中s是变化的时间戳。通过引入time和execjs库,实现了参数加密,并在调用API时确保时间戳一致以避免错误响应。最后,展示了完整代码示例,包括添加headers和cookies来处理请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 发下只有sing是变化的,接下来就是对sign的解密,老办法直接搜索

 

 上一个函数reture返回去的值为sign;

 sign是:把(r.token + "&" + s + "&" + a + "&" + n.data)做为参数,经过上面的函数加密而成的,

参数里面只有s是做为时间戳而变化的,其他没有变化

准备要加密的参数

#(r.token + "&" + s + "&" + a + "&" + n.data)
import time
toke="8492c0ab1bc89f984e7a905d240730c0"
s=int(time.time()*1000)
a='12574478'
data='{"appName":"cateCpcAd","keywords":"儿童手表","urlEncodeType":"NO"}'
sign=toke+"&"+str(s)+"&"+a+"&"+data
print(sign)

可以看到解决:

 校验:我们明白加密参数只有时间戳是变化的,所以我们使用时间戳看看我们的sign是不是正确

 

 可以看到了sign一样

import time
import execjs
import requests
def Encrypted_parameter():
    toke="8492c0ab1bc89f984e7a905d240730c0"
    s=int(time.time()*1000)
    a='12574478'
    data='{"appName":"cateCpcAd","keywords":"儿童手表","urlEncodeType":"NO"}'
    sign=toke+"&"+str(s)+"&"+a+"&"+data
    resp=execjs.compile(open("sign.js",mode="r",encoding="utf-8").read()).call("sign",sign)
    return resp,data
def first_get(sign,data):
    print(data)
    url="https://h5api.m.1688.com/h5/mtop.1688.wap.ads.get/1.0/?"
    params={
    "jsv": "2.6.1",
    "appKey": "12574478",
    "t": "1675576271643",
    "sign": sign,
    "api": "mtop.1688.wap.ads.get",
    "v": "1.0",
    "type": "jsonp",
    "dataType": "jsonp",
    "timeout": "20000",
    "callback": "mtopjsonp1",
    "data": "%7B%22appName%22%3A%22cateCpcAd%22%2C%22keywords%22%3A%22%E5%84%BF%E7%AB%A5%E6%89%8B%E8%A1%A8%22%2C%22urlEncodeType%22%3A%22NO%22%7D"
}
   # params["data"]=data
    headers={
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
        "referer": "https://show.1688.com/"
    }
    resp=requests.get(url=url,params=params,headers=headers)#params拼接完整的url
    return resp.text

if __name__ == '__main__':
    sign,data=Encrypted_parameter()
    print(sign)
    print(first_get(sign,data))

["FAIL_SYS_TOKEN_EMPTY::令牌为空"]我们加上cookies试试

加上cookies:["FAIL_SYS_ILLEGAL_ACCESS::非法请求"],我们加时间戳

完整的代码

#(r.token + "&" + s + "&" + a + "&" + n.data)
import time
import execjs
import requests
def Encrypted_parameter():
    toke="8492c0ab1bc89f984e7a905d240730c0"
    s=int(time.time()*1000)
    a='12574478'
    data='{"appName":"cateCpcAd","keywords":"儿童手表","urlEncodeType":"NO"}'
    sign=toke+"&"+str(s)+"&"+a+"&"+data
    resp=execjs.compile(open("sign.js",mode="r",encoding="utf-8").read()).call("sign",sign)
    return resp,data,s
def first_get(sign,data,s):
    url="https://h5api.m.1688.com/h5/mtop.1688.wap.ads.get/1.0/?"
    params={
    "jsv": "2.6.1",
    "appKey": "12574478",
    "t": s,        #注意里面的时间戳必须和上面的一致,使用不能使用int(time.time()*1000),只能从上面传递给下面
    "sign": sign,
    "api": "mtop.1688.wap.ads.get",
    "v": "1.0",
    "type": "jsonp",
    "dataType": "jsonp",
    "timeout": "20000",
    "callback": "mtopjsonp1",
    "data": data
    }
    #params["data"]=data
    headers={
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
        "referer": "https://show.1688.com/",
        "cookie": "_m_h5_tk=8492c0ab1bc89f984e7a905d240730c0_1675577418201; _m_h5_tk_enc=41136a2430d4d74ee68f0d87dfad572e; cna=2ZpNHAqSmQsCAXUXUwCxaJBf; xlly_s=1; cookie2=1aae865588bc73d9ee6406f6625da379; t=36b7a3f2764d151ee150479a7469fb17; _tb_token_=751599e5eb515; __cn_logon__=false; _csrf_token=1675570410633; alicnweb=touch_tb_at%3D1675575430232; tfstk=cexFBdvEnDneVKv-MGjyubWEpcIdwV5lGlWV-bThKjPMP9fDd7BgC86NURPl-; l=fBrb79buT98Y2jYaKOfaFurza77OSIRYYuPzaNbMi9fPOMCB5lSVW6JhK-Y6C3GVF606R3PZC7jvBeYBq3tSnxvOCgpMGIMmndLHR35..; isg=BBcXOwC7OLH1vrw9c7IKfHHwpothXOu-8mNbvWlEM-ZNmDfacSx7DtW8_jiGcMM2"
    }
    resp=requests.get(url=url,params=params,headers=headers)#params拼接完整的url
    return resp.text

if __name__ == '__main__':
    sign,data,s=Encrypted_parameter()
    response=first_get(sign,data,s)
    print(response)

### JavaScript RudderEncrypt Cookies 加密逆向分析 #### 了解RudderEncrypt库的工作原理 为了成功实现对`RudderEncrypt`加密的Cookies进行逆向分析,理解该库如何操作至关重要。通常情况下,JavaScript加密库如`RudderEncrypt`会采用特定算法来处理字符串或对象,并将其转化为不可读的形式存储于Cookie中[^1]。 ```javascript // 示例:假设这是简化版的RudderEncrypt加密逻辑 function encryptData(data) { var key = 'secretKey'; // 秘钥通常是固定的或者是基于某些变量动态生成 var encryptedString = CryptoJS.AES.encrypt(JSON.stringify(data), key).toString(); document.cookie = "encrypted=" + encodeURIComponent(encryptedString); } ``` #### 获取秘钥与初始化向量(IV) 对于AES这类对称加密算法而言,获取用于加密/解密过程中的秘钥以及可能存在的初始化向量是非常重要的一步。这些信息往往隐藏在网页源代码内或是通过网络请求传递给客户端程序[^2]。 #### 分析前端代码寻找线索 仔细审查网站加载过程中涉及的所有资源文件,特别是那些负责设置和读取Cookies的部分。这有助于定位到实际调用了哪些API来进行数据保护措施的应用场景下所使用的具体参数配置情况[^3]。 #### 实现本地模拟环境测试解密功能 一旦掌握了足够的细节描述有关于目标站点是如何运用`RudderEncrypt`完成其安全机制的信息后,在本地环境中搭建一套相似结构的服务端接口用来验证自己的猜想是否正确显得尤为必要。下面是一个简单的例子展示怎样利用已知条件尝试还原原始输入: ```python from Crypto.Cipher import AES import base64 def decrypt_data(ciphertext, secret_key='default_secret'): cipher = AES.new(secret_key.encode(), AES.MODE_ECB) decrypted_bytes = unpad(cipher.decrypt(base64.b64decode(ciphertext)), AES.block_size) try: return json.loads(decrypted_bytes.decode()) except Exception as e: print(f"Decryption failed: {e}") return None # Helper function to remove padding from the decrypted data. def unpad(s): return s[:-ord(s[len(s)-1:])] if __name__ == "__main__": sample_cookie_value = input("Enter the value of the encrypted cookie:") result = decrypt_data(sample_cookie_value) if result is not None: print("Successfully decrypted:", result) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值