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}×tamp={timestamp}&signature={signature}"
return signature
if __name__ == "__main__":
HEADERS_PORTAL = {
"Content-Type": "application/json",
'signature': 'account=×tamp=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())