python完成加密参数sign计算并输出指定格式的字符串
加密规则:
1.固定加密字符串+字符串组合(key/value的形式,并通过aissc码排序),
2.通过sha1算法对排序后的字符串进行加密,
3.最终输出需要的参数sign
4.完成请求参数数据的格式输出(因为浏览器复制出来的格式直接用python是不能请求的所以我用了之前写的一个方法来完成请求数据格式的转换)
例如:
输入:
'''course_finance_id[0]:252638
total_price:0
state:1
finan_rmk:343
timestamp:122
sign:11'''xxx
输出:
'course_finance_id[0]=252638&total_price=0&state=1&finan_rmk=343×tamp=1572505825134&sign=feab1228e93329b4e4adcebc7bcx'x'x2c4225a1eccba'
不废话,上代码:
def fwh_sign_sha1(self,str_in):#服务号请求签名处理封装
'''主要过程:
1.替换输入字符串中的时间戳为最新的时间戳
2.将字符串中的sign字段过滤掉并通过ascii对其进行排序,因为加密时不需要此字段
3.将排序且处理后的字符串通过sha1算法,得到加密字符串
4.将得到的加密字符串替换至原字符串'''
search_time_str='timestamp:'
search_sign_str='sign:'
str_inSource=re.search('(%s.+)'%(search_time_str),str_in)#匹配字段时间戳(timestamp)
if str_inSource is not None:
time_str=self.get_timestamp()#最终需要的时间戳,13位
str_inSource=str_inSource.group()
search_str_inSource=re.search('\s',str_inSource)
#匹配时间戳,key与value是否包含空格
#如果包含空格,替换时加上空格,如果不处理会有问题(字符串格式与其他地方不一致)
if search_str_inSource is not None:
str_equalSource=re.sub(str_inSource,'%s%s%s'%(search_time_str,search_str_inSource.group(),time_str),
str_in)#将输入的时间戳替换为需要的时间戳,并加上匹配出来得空格
else:
str_equalSource=re.sub(str_inSource,'%s%s'%(search_time_str,time_str),
str_in)#将输入的时间戳替换为需要的时间戳
input_list_source=str_equalSource.split('\n')#以换行符分隔字符串并转换位列表
input_list=[a for a in input_list_source
if (search_sign_str or '%s\s'%(search_sign_str) ) not in a]#列表过滤字段sign
out_list=sorted(input_list)#对list进行排序
out_str='\n'.join(out_list)#将排序后的list拼接为字符串
input_sign_str=self.requestDataToStr_firefoxAndChrome(out_str,'','').decode()#获取拼接完成后的请求参数字符串(sign)
'''这个方法默认对请求参数进行了编码处理,所以这里需手动解码'''
out_sign_str=self.sha1_Encry(input_sign_str)#得到加密后的加密字符串
str_inSource_sign=re.search('(%s.+)'%(search_sign_str),str_in)#匹配字段签名验证(sign)
if str_inSource_sign is not None:
str_inSource_sign=str_inSource_sign.group()
search_inSource_sign=re.search('\s',str_inSource)
#匹配sign,key与value是否包含空格
#如果包含空格,替换时加上空格,如果不处理会有问题(字符串格式与其他地方不一致)
if search_inSource_sign is not None:
str_last_sign=re.sub(str_inSource_sign,'%s%s%s'%(search_sign_str,search_inSource_sign.group(),
out_sign_str),str_equalSource)#将输入的时间戳替换为需要的时间戳
else:
str_last_sign=re.sub(str_inSource_sign,'%s%s'%(search_sign_str,out_sign_str),
str_equalSource)#将输入的时间戳替换为需要的时间戳
# print(str_last_sign)
str_give=self.requestDataToStr_firefoxAndChrome(str_last_sign)
# print(str_give)
return str_give else:
print('输入字符串没有sign对象:sign,无法完成数据转换')
return None else:
print('输入字符串没有时间戳对象:timestamp,无法完成数据转换')
return None
#字符串进行sha1算法加密方法
def sha1_Encry(self,str_in,Encay_strOne=Encay_str):#对字符串进行加密
str_out=hashlib.sha1() #采用sha1加密
str_out.update(str('%s%s'%(str_in,Encay_str)).encode(encoding='utf-8'))
return str_out.hexdigest()
#输出13位时间戳方法
def get_timestamp(self):#输出当前时间的13位时间戳
current_milli_time = lambda: int(round(time.time() * 1000))#输出13位时间戳,round:对浮点数进行四舍五入
return str(current_milli_time())
#字符串格式处理方法
def requestDataToStr_firefoxAndChrome(self,str_in,space_one='=',space_two='&'):
try:
str_colon=re.search(':\W?|\s*:\W?',str_in) #匹配出字符串中所有的冒号
if not str_colon==None:
str_colon=str_colon.group()
str_equal=re.sub(str_colon,space_one,str_in) #将字符串中的冒号替换为等于号(: >>> =)
str_lin=re.search("(\s\n*){2,}|(\s\n*)",str_equal) #匹配出字符串中所有的换行符与空格,不写表示不限定匹配次数
if not str_lin==None:
str_lin=str_lin.group()
str_give=re.sub(str_lin,space_two,str_equal) #将字符串中的换行符替换为& (\n >>> &)
str_lin2=re.search('\s.*',str_give)
if str_lin2 is not None:
str_lin2=str_lin2.group()
str_lin3=re.search('=',str_lin2)
if str_lin3 is not None and 'time' in str_give: #对请求参数含有时间字段进行特殊处理
try:
str_lin3=str_lin3.group()
str_give2=re.sub(str_lin3,':',str_lin2)
str_give3=re.sub(str_lin2,str_give2,str_give)
# print(str_give3)
return str_give3.encode() #返回字符串,并对数据进行编码处理
except Exception as error:
print(error)
else:
# print(str_give)
return str_give.encode()
else:
# print(str_give)
return str_give.encode()
else:
return str_equal.encode()
else:
print("字符串格式匹配错误")
return None
except Exception as error:
print("数据处理失败,原因为:\n%s"%(error))
写这个方法的时候遇到了一些问题,所以各位再实践的过程中一定要细心,字符串处理时一定要注意对空格的处理,最好保持格式的统一(参数替换时如果其他参数带有空格,替换时不要全给替换掉了,因为正则匹配时匹配不到就会使转换后的字符串达不到预期效果,看后续能不能想到更好的解决方法把),这样能避免一些问题
python完成加密参数sign计算并输出指定格式的字符串的更多相关文章
- 使用printf输出各种格式的字符串( 转载)
1. 原样输出字符串: printf("%s", str); 2. 输出指定长度的字符串, 超长时不截断, 不足时右对齐: printf("%Ns" ...
- Java 输出指定编码的字符串
Java Sting类有个根据byte,字符编码来输出的构造函数.以下为java文档中的解释.public String(byte[] bytes, String charsetName) throw ...
- 爬虫破解js加密(一) 有道词典js加密参数 sign破解
在爬虫过程中,经常给服务器造成压力(比如耗尽CPU,内存,带宽等),为了减少不必要的访问(比如爬虫),网页开发者就发明了反爬虫技术. 常见的反爬虫技术有封ip,user_agent,字体库,js加密, ...
- Python学习(三) 输出任意格式的字符串以及字符串的切片
在Python中想要输出一句话,如下 a='hello world' print a //打印出的是hello world print 'hello \n world' //打印出的是 //hello ...
- Python读取文本,输出指定中文(字符串)
因业务需求,需要提取文本中带有检查字样的每一行. 样本如下: 1 投入10kVB.C母分段820闭锁备自投压板 2 退出10kVB.C母分段820备投跳803压板 3 退出10kVB.C母分段820备 ...
- Python中将(字典,列表等)变量格式化成字符串输出
比如原始的List变量的值是这种: [{"]}] 而想要将其输出为带缩进的,树状的,很漂亮的效果,那么可以通过这样的方法: import json #demoDictList is the ...
- python print的参数介绍
参考print的官方文档 print(...) print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints th ...
- Week08_day01 (Hive实现按照指定格式输出每七天的消费平均数)
Hive实现按照指定格式输出每七天的消费平均数 数据准备 2018/6/1,10 2018/6/2,11 2018/6/3,11 2018/6/4,12 2018/6/5,14 2018/6/6,15 ...
- python json.dumps()函数输出json格式,使用indent参数对json数据格式化输出
在python中,要输出json格式,需要对json数据进行编码,要用到函数:json.dumps json.dumps() :是对数据进行编码 #coding=gbkimport json dict ...
随机推荐
- 031 SSM综合练习07--数据后台管理系统--用户详情查询
1.用户详情查询流程分析 2.代码实现 (1)user-list.jsp页面部分代码 点击jsp页面中的详情按钮,发送请求到UserController.java <!--数据列表--> ...
- Java生产消费者模型——代码解析
我们将生产者.消费者.库存.和调用线程的主函数分别写进四个类中,通过抢夺非线程安全的数据集合来直观的表达在进行生产消费者模型的过程中可能出现的问题与解决办法. 我们假设有一个生产者,两个消费者来共同抢 ...
- cf 595 补题
1.B2 Books Exchange (hard version) 题意:有n(1~n)个孩子看书,定义一个数组,记录了每个孩子看完
- golang(二)
基本结构和基本数据类型 指针 不像 Java 和 .NET,Go 语言为程序员提供了控制数据结构的指针的能力:但是,你不能进行指针运算.通过给予程序员基本内存布局,Go 语言允许你控制特定集合的数据结 ...
- Python入门 常量 注释 基础数据类型 用户输入 流程控制
Python入门 一.常量 在Python中,不像其他语言有绝对的常量,修改会报错,在Python中有个约定俗成的规定--常量就是将变量名大写. 尽量保持不更改的一种量 , 这个常量有是干什么的呢 其 ...
- PB 点击标题行排序和双击打开编辑页面共存不冲突的方法
根据doubleclicked() 事件的参数 row 进行判断 大于0才进入编辑页面(不能用getrow()事件获取行id,双击标题行获取的是1) if row>0 then event ue ...
- 打家劫舍II
题目描述(LeetCode) 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的 ...
- 【SpringBoot】SpingBoot整合AOP
https://blog.csdn.net/lmb55/article/details/82470388 [SpringBoot]SpingBoot整合AOPhttps://blog.csdn.net ...
- 测度(Measure)
测度概述 数学上,测度(Measure)是一个函数,它对一个给定集合的某些子集指定一个数,这个数可以比作大小.体积.概率等等.传统的积分是在区间上进行的,后来人们希望把积分推广到任意的集合上,就发展出 ...
- Kubernetes Storage Persistent Volumes
链接:https://kubernetes.io/docs/concepts/storage/persistent-volumes/ 支持的参数,比如mountOptions在这里可以找到 删除正在被 ...