基于python实现数组格式参数加密计算


Posted in Python onApril 21, 2020

代码示例

#输入
'''order_id:31489
join_course[0][join_tel]:13130999882
join_course[0][join_name]:任学雨
join_course[0][join_card_afterfour]:043X
join_course[0][join_school]:铭博教育咨询
join_course[1][join_tel]:13130999883
join_course[1][join_name]:任学雨
join_course[1][join_card_afterfour]:043X
join_course[1][join_school]:铭博教育咨询
join_course[2][join_tel]:13130999884
join_course[2][join_name]:任学雨
join_course[2][join_card_afterfour]:043X
join_course[2][join_school]:铭博教育咨询
join_course[3][join_tel]:13130999885
join_course[3][join_name]:任学雨
join_course[3][join_card_afterfour]:043X
join_course[3][join_school]:铭博教育咨询
timestamp:1574921552698
sign:8936b324e417b31d97f0c3e9a904dssss3'''
#输出
join_course[{"join_tel":"13130999882","join_name":"任学雨","join_card_afterfour":"043X","join_school":"铭博教育咨询"},{"join_tel":"13130999883","join_name":"任学雨","join_card_afterfour":"043X","join_school":"铭博教育咨询"},{"join_tel":"13130999884","join_name":"任学雨","join_card_afterfour":"043X","join_school":"铭博教育咨询"},{"join_tel":"13130999885","join_name":"任学雨","join_card_afterfour":"043X","join_school":"铭博教育咨询"}]order_id31489timestamp1575001757726994(str_encrypt)固定加密字符串

大概思路:

1.将输入字符串切割为list

2.提取数组指定参数

3.提取除sign之外的非数组指定参数并排序(asicc码排序)

4.处理数组参数拼接问题(先处理数组内参数,将key与value转换为字典,再将字典添加至list,最后拼接字符串'join_course‘,拼接非数组参数与加密字符串)

5.计算加密字符串sign并提取输入的字符串

6.拼接最终的字符串,并处理请求数据格式

def fwh_sign_sha1_Array(self,str_in):#服务请求签名处理封装(请求格式为数组时的封装)
    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_str='\n'.join(input_list)#将排序后的list拼接为字符串
      out_list_join_course=[a for a in input_list if ('[' and ']') in a ]#去除数组外的其他参数
      input_list_other=sorted([a for a in input_list if ('[' or ']') not in a ])#获取数组外的其他参数并排序
      input_list_other_str='\n'.join(input_list_other)#将排序后的list拼接为字符串
      input_out_list_other_str=self.requestDataToStr_firefoxAndChrome(input_list_other_str,'','').decode()#获取拼接完成后的请求参数字符串(sign)
      join_course_list=[]#数组
      join_course_dict={}#数组中的dict
      for index,i in enumerate(out_list_join_course):
        join_course_index=i.find('[')
        join_course=i[:join_course_index]#匹配join_course
        Array_index=i[join_course_index:].find(']')#匹配[index]的下标
        Array=i[join_course_index:][:Array_index+1]#取出[index]
        Array_key_data=i[join_course_index:][Array_index+1:]#取出[0]后面的值
        search_colon=Array_key_data.find(':')#匹配出冒号的index
        Array_key=Array_key_data[1:search_colon-1]#匹配key(冒号前面的值)并去除[]
        Array_value=Array_key_data[search_colon+1:]#匹配value(冒号后面的值)
        join_course_dict[Array_key]=Array_value#将匹配出来的key与value添加至dict
        if index+1<len(out_list_join_course):
          #判断上一个元素的部分内容(索引前的内容)是否包含于list下一个元素的内容
          #(如果不包含那么说明当前元素就是本组数据的最后一个,此时将dict添加至对应的list)
          #并清空字典(不清除会导致最终插入的值是重复的,因为key是一样的)
          if join_course+Array not in(out_list_join_course[index+1]):
            join_course_list.append(join_course_dict)
            join_course_dict={}
        else:#如果当前元素是list中的最后一个元素那么直接添加将dict至对应的list
          join_course_list.append(join_course_dict)
          join_course_dict={}
      #将list里面的数组转换为json格式,这里只能对list进行使用,不用对数组中的dict使用
      #ensure_ascii:防止中文被转义,separators:去除字符串中多余的空格
      join_course_list=json.dumps(join_course_list,ensure_ascii=False,separators=(',', ':'))
      #拼接加密前的请求字符串,用换行符区分数组参数与非数组参数(目的是方便转换为list)
      join_course_str=join_course+str(join_course_list)+'\n'+input_out_list_other_str
      join_course_str_list=sorted(join_course_str.split('\n'))#对list进行排序处理
      join_course_last_str=''.join(join_course_str_list)#对排序后的list拼接为字符串
      out_sign_str=self.sha1_Encry(join_course_last_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)
        return str_give

      else:
        print('输入字符串没有sign对象:sign,无法完成数据转换')
        return None

    else:
      print('输入字符串没有时间戳对象:timestamp,无法完成数据转换')
      return None

期间遇到的问题:

1.dict的单引号在使用json解析时会出问题,需要转换为双引号("),使用json.dumps可处理为这样的格式

2.json.dumps方法的问题:1.中文会自动转义,需指定参数ensure_ascii=false,默认时true;2.转换是会自动产生空格,然而开发加密时没有空格,需要去掉,需指定参数separators=(',', ':')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解MySQL数据类型int(M)中M的含义
Nov 20 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
Sep 26 Python
解决nohup重定向python输出到文件不成功的问题
May 11 Python
Python使用add_subplot与subplot画子图操作示例
Jun 01 Python
python中如何使用分步式进程计算详解
Mar 22 Python
python3实现二叉树的遍历与递归算法解析(小结)
Jul 03 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
python使用pymongo与MongoDB基本交互操作示例
Apr 09 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
安装python依赖包psycopg2来调用postgresql的操作
Jan 01 Python
python网络爬虫实现发送短信验证码的方法
Feb 25 Python
python实现与redis交互操作详解
Apr 21 #Python
Django-migrate报错问题解决方案
Apr 21 #Python
pandas读取csv文件提示不存在的解决方法及原因分析
Apr 21 #Python
jupyter 导入csv文件方式
Apr 21 #Python
tensorflow指定CPU与GPU运算的方法实现
Apr 21 #Python
Python多线程实现支付模拟请求过程解析
Apr 21 #Python
安装多个版本的TensorFlow的方法步骤
Apr 21 #Python
You might like
discuz authcode 经典php加密解密函数解析
2020/07/12 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
围观tangram js库
2010/12/28 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
[00:35]DOTA2上海特级锦标赛 Newbee战队宣传片
2016/03/03 DOTA
详解Python安装scrapy的正确姿势
2018/06/26 Python
基于sklearn实现Bagging算法(python)
2019/07/11 Python
Python 分发包中添加额外文件的方法
2019/08/16 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
有原因的手表:Flex Watches
2019/03/23 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
艺术教育实施方案
2014/05/03 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
四风问题对照检查材料
2014/09/22 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
文员岗位职责范本
2015/04/16 职场文书
军训新闻稿范文
2015/07/17 职场文书