http signature参数笔记

1、关于“http请求中signature参数的作用”,ChatGPT回复如下:

HTTP请求中的signature参数通常用于验证请求的真实性和完整性。具体而言,signature是一种加密字符串,通常使用哈希算法或其他加密算法生成,用于对请求中的某些数据进行签名。

当服务器收到带有signature参数的请求时,它可以使用相同的算法对请求中的数据进行签名,然后将其与请求中的signature参数进行比较。如果两者相等,则表明请求是从预期的发送方发送的,并且请求中的数据没有被篡改。

通常,signature参数用于保护敏感数据,例如用户身份验证令牌或支付信息,以确保这些数据不会被恶意用户篡改或窃取。

2、关于“HTTP请求中的signature参数的值是怎么生成的?”,ChatGPT回复如下:

HTTP请求中的signature参数通常是用来验证请求的合法性和完整性的参数。具体的生成方式取决于使用的签名算法和具体实现方式,以下是一个常见的做法:

1. 在请求中添加一个时间戳参数,用于防止重放攻击。

2. 将请求中除了signature参数外的所有参数按照字典序排序,并将它们按照key1=value1&key2=value2的格式拼接成一个字符串。

3. 在字符串末尾加上一个秘密的密钥,用于防止篡改。

4. 对拼接好的字符串进行签名,常见的签名算法有MD5、SHA1、HMAC等。

5. 将签名结果作为signature参数的值添加到请求中。

接收方可以按照同样的方式生成签名,然后将生成的签名与请求中的signature参数进行比较,以判断请求的合法性和完整性。

3、关于“请提供python代码,用于生成http请求中的signature参数”,得到答复如下:

import hashlib
import hmac
import urllib.parse

def generate_signature(secret_key, params):
    """
    生成HTTP请求中的signature参数
    :param secret_key: str,API密钥的私钥部分
    :param params: dict,HTTP请求中的所有参数,包括除signature以外的所有参数
    :return: str,生成的signature参数的值
    """
    # 将参数按照ASCII码升序排列,并用&符号拼接起来
    sorted_params = '&'.join(['{}={}'.format(k, v) for k, v in sorted(params.items())])

    # 将请求字符串和API密钥的私钥部分拼接起来
    sign_str = '{}{}'.format(sorted_params, secret_key)

    # 使用SHA256算法计算签名结果
    signature = hmac.new(secret_key.encode('utf-8'), sign_str.encode('utf-8'), hashlib.sha256).hexdigest()

    # 将signature参数的值进行URL编码
    signature_encoded = urllib.parse.quote_plus(signature)

    return signature_encoded


# 使用示例python
# 定义API密钥的私钥部分
secret_key = 'your_secret_key'

# 定义HTTP请求中的所有参数
params = {
    'param1': 'value1',
    'param2': 'value2',
    # ...
}

# 生成signature参数的值
signature = generate_signature(secret_key, params)

# 将signature参数的值加入HTTP请求中
params['signature'] = signature

# 发送HTTP请求
# ...

4、注意到代码中没有时间戳参数,得到补充:

在主程序中,我们使用time库获取当前时间戳,并将其乘以1000来将其转换为毫秒级别的时间戳。

timestamp = int(time.time() * 1000)

5、但是不同的网站,signature的生成算法和私有秘钥是不同的,如何获取生成算法和秘钥?

通过浏览器F12启动开发者工具,搜索关键词“signature”,设置断点进行调试,详情请参考文章:

js逆向:【硬干货】手把手实战某条_signature参数破解(上)

js逆向:【硬干货】手把手实战某条_signature参数破解(中)

js逆向:【硬干货】手把手实战某条_signature参数破解(下)

 

 6、我这边的应用场景就是加入秘钥后的字典,排序拼接后进行SHA256算法,没有遇到参考文献中的复杂情况,相关代码如下:

import requests
import time
import json
import urllib3
import base64
urllib3.disable_warnings()
import hashlib
import urllib


def __get_sha256_sign(raw_data):
    sorted_data = sorted(raw_data.items(), key=lambda x: x[0])
    data = '&'.join(f'{k}={v}' for k, v in sorted_data)
    s = hashlib.sha256(data.encode())
    return s.hexdigest()

def get_current_timestamp(unit=None):
    """
    获取当前时间戳
    unit : 1-秒(s);2-毫秒(ms);
    """
    now = time.time()  # 返回float数据
    if unit == 1:
        now = int(now)
    elif unit == 2:
        now = int(round(now * 1000))
    return now

def get_http_signature(url, account=''):
    path = urllib.parse.urlparse(url).path
    timestamp = get_current_timestamp(unit=2)
    uri = path[1:]
    raw_data = {
        'account': account,
        'timestamp': timestamp,
        'key': "ZKp8j7L6XoCHMeuA",  # private string
        'uri': uri
    }
    signature = __get_sha256_sign(raw_data)
    signature = f"account={account}&timestamp={timestamp}&signature={signature}"
    return signature

if __name__ == "__main__":
    HEADERS_PORTAL = {
        "Content-Type": "application/json",
        'signature': 'account=&timestamp=1660532797891&signature=415af605fd2346a6da9f54704197730f6e1c88b38daf006cd6224d9b3be13a1f',
    }
    url_login = 'https://xxx'
    data_login = {
        "account": "aaaaa",
        "password": "xxxxx",
    }
    HEADERS_PORTAL['signature'] = get_http_signature(url_login, account='aaaaa')
    html = requests.post(url_login, data=json.dumps(data_login), headers=HEADERS_PORTAL)
    print(html)
    print(html.json())

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值