很多大佬分享了快手sig参数逆向破解的过程,我只是在大佬的基础上把sig加密部分代码转成python。
sig生成原理:把url问号后面的参数转成dict,同时把form_data参数放在同一个dict,然后对dict进行排序,排序后转成字符串并且加salt,最后进行md5加密就可以了。
- 把url参数转为dict
def get_map_from_string(str):
"""
把url的参数转为dict
:param str:
:return:
"""
map = {}
str_list = str.split('&')
for data in str_list:
item = data.split('=')
map[item[0]] = item[1]
return map
- 把url参数dict和form_data合并为一个dict并排序,转为字符串,然后加盐
def get_url_str(map1,map2,salt = '382700b563f4'):
"""
把url参数和formdata参数排序,加盐,返回字符串
:param map1:url参数dict
:param map2:formdata参数dict
:param salt:盐,默认382700b563f4,也有可能会变动
:return:
"""
map = dict(map1,**map2)
aps = sorted(map.items(), key = lambda d: d[0])
data = {}
for i in aps:
if i[0] == 'sig' or i[0] == '__NS_sig3' or i[0] == '__NStokensig':
pass
else:
data.update(dict({i[0]:i[1]}))
url_str = ""
for key,value in data.items():
str = key + '=' + unquote(value)
url_str += str
return url_str + salt
3 md5加密
def data_md5(content):
m = hashlib.md5()
m.update(content.encode("utf-8"))
return m.hexdigest()
def create_sig(query_str,post_arr):
url_arr = get_map_from_string(query_str)
str = get_url_str(url_arr, post_arr)
return data_md5(str)
url的部分参数是会变的,所以sig也会失效,有效期不超过两天。