基于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 相关文章推荐
使用python实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
python实现颜色rgb和hex相互转换的函数
Mar 19 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 Python
django1.8使用表单上传文件的实现方法
Nov 04 Python
Python内置函数OCT详解
Nov 09 Python
pyqt5 从本地选择图片 并显示在label上的实例
Jun 13 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
Aug 08 Python
详解Python中的format格式化函数的使用方法
Nov 20 Python
使用wxpy实现自动发送微信消息功能
Feb 28 Python
Java byte数组操纵方式代码实例解析
Jul 22 Python
Python爬虫之Selenium多窗口切换的实现
Dec 04 Python
Python实现拼音转换
Jun 07 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
xajax写的留言本
2006/11/25 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
php session的锁和并发
2016/01/22 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
javascript onmouseout 解决办法
2010/07/17 Javascript
JQuery魔力之$(&quot;tagName&quot;)与selector
2012/03/05 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
jquery-tips悬浮提示插件分享
2015/07/31 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
python解决字典中的值是列表问题的方法
2013/03/04 Python
python原始套接字编程示例分享
2014/02/21 Python
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
Python 中的 else详解
2016/04/23 Python
python绘制简单折线图代码示例
2017/12/19 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
简单了解Django项目应用创建过程
2020/07/06 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
群众路线教育党课主持词
2014/04/01 职场文书
毕业实习感受与体会
2015/05/26 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书