基于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使用cookielib库示例分享
Mar 03 Python
Python中的高级函数map/reduce使用实例
Apr 13 Python
python插入数据到列表的方法
Apr 30 Python
Python制作简单的网页爬虫
Nov 22 Python
教大家使用Python SqlAlchemy
Feb 12 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
Python3安装Pillow与PIL的方法
Apr 03 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
Python django框架应用中实现获取访问者ip地址示例
May 17 Python
python 字典操作提取key,value的方法
Jun 26 Python
python文字转语音的实例代码分析
Nov 12 Python
Django Form and ModelForm的区别与使用
Dec 06 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
PHP 编程安全性小结
2010/01/08 PHP
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
jQuery.ajax 用户登录验证代码
2010/10/29 Javascript
js中AppendChild与insertBefore的用法详细解析
2013/12/16 Javascript
JS中FRAME的操作问题实例分析
2014/10/21 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
ionic实现滑动的三种方式
2016/08/27 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
Django实现自定义404,500页面教程
2017/03/26 Python
使用python实现接口的方法
2017/07/07 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
python实现代码统计器
2019/09/19 Python
Python 切分数组实例解析
2019/11/07 Python
Python3并发写文件与Python对比
2019/11/20 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
在线课程:Skillshare
2019/04/02 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
个人培训自我鉴定
2014/03/28 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
队名及霸气口号大全
2015/12/25 职场文书
redis复制有可能碰到的问题汇总
2022/04/03 Redis
redis lua限流算法实现示例
2022/07/15 Redis