加密规则:

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&timestamp=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计算并输出指定格式的字符串的更多相关文章

  1. 使用printf输出各种格式的字符串( 转载)

    1. 原样输出字符串:    printf("%s", str); 2. 输出指定长度的字符串, 超长时不截断, 不足时右对齐:    printf("%Ns" ...

  2. Java 输出指定编码的字符串

    Java Sting类有个根据byte,字符编码来输出的构造函数.以下为java文档中的解释.public String(byte[] bytes, String charsetName) throw ...

  3. 爬虫破解js加密(一) 有道词典js加密参数 sign破解

    在爬虫过程中,经常给服务器造成压力(比如耗尽CPU,内存,带宽等),为了减少不必要的访问(比如爬虫),网页开发者就发明了反爬虫技术. 常见的反爬虫技术有封ip,user_agent,字体库,js加密, ...

  4. Python学习(三) 输出任意格式的字符串以及字符串的切片

    在Python中想要输出一句话,如下 a='hello world' print a //打印出的是hello world print 'hello \n world' //打印出的是 //hello ...

  5. Python读取文本,输出指定中文(字符串)

    因业务需求,需要提取文本中带有检查字样的每一行. 样本如下: 1 投入10kVB.C母分段820闭锁备自投压板 2 退出10kVB.C母分段820备投跳803压板 3 退出10kVB.C母分段820备 ...

  6. Python中将(字典,列表等)变量格式化成字符串输出

    比如原始的List变量的值是这种: [{"]}] 而想要将其输出为带缩进的,树状的,很漂亮的效果,那么可以通过这样的方法: import json #demoDictList is the ...

  7. python print的参数介绍

    参考print的官方文档 print(...) print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints th ...

  8. 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 ...

  9. python json.dumps()函数输出json格式,使用indent参数对json数据格式化输出

    在python中,要输出json格式,需要对json数据进行编码,要用到函数:json.dumps json.dumps() :是对数据进行编码 #coding=gbkimport json dict ...

随机推荐

  1. Matlab 非线性规划问题模型代码

    非线性规划问题的基本内容 非线性规划解决的是自变量在一定的非线性约束或线性约束组合条件下,使得非线性目标函数求得最大值或者最小值的问题. 当目标函数为最小值时,上述问题可以写成如下形式: \[ \mi ...

  2. 不会前后端,用vps搭建个人博客(二)

    <接上一篇>   四.添加网页内容 1.下载安装WordPress 输入以下命令: wget https://wordpress.org/latest.tar.gz 当然你也可以用浏览器进 ...

  3. checkbox之全选和反选

    先导入jquery组件 <input type="checkbox" id="checkall">全选<input type="ch ...

  4. CSDN刷阅读数

    今天我们来盘一下csdn,做一个小程序,为什么做这个呢?今天小编看着我的博客的阅读数,唉,惨不忍睹,没办法,只能想一些........呃呃呃呃,你懂的. 话不多说,分析一波csdn的阅读数,计数原理是 ...

  5. Windows 2003 服务器 关闭IIS中FTP匿名访问

    控制面板 –> 管理工具 –> Internet信息服务管理器打开后左侧选择相应的FTP站点右击 –> 属性 –> 安全帐户允许匿名连接 前面的√取消掉,点击确定完成

  6. ComPtr的介绍以及使用

    ComPtr是为COM而设计的智能指针.它支持WindowsRT,也支持传统Win32.相比ATL里的CComPtr类,它有了一些提升. ComPtr包含在Windows 8.x SDK and Wi ...

  7. Nas 系统的虚拟化方案

    Nas 系统的虚拟化方案 https://zhuanlan.zhihu.com/p/55025102 对搞技术的人来说,Nas 是个理想的玩具,既然是程序员用的 Nas ,自然要专业一点,不能像小白一 ...

  8. loj#10012\poj2018 Best Cow Fences(二分)

    题目 #10012 「一本通 1.2 例 2」Best Cow Fences 解析 有序列\(\{a_i\}\),设\([l,r]\)上的平均值为\(\bar{x}\),有\(\sum_{i=l}^r ...

  9. java实现在线预览--poi实现word、excel、ppt转html

    java实现在线预览 - -之poi实现word.excel.ppt转html 简介 java实现在线预览功能是一个大家在工作中也许会遇到的需求,如果公司有钱,直接使用付费的第三方软件或者云在线预览服 ...

  10. 在DoNetMVC中使用控制反转和依赖注入【DI】

    本次是在MVC5中使用Autofac 第一步:程序包管理器控制台 Install-Package Autofac.MVC5 引入nuget包 这样成功之后,会在引用中出现两个DLL,分别是Autofa ...