基于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 相关文章推荐
记录Django开发心得
Jul 16 Python
python继承和抽象类的实现方法
Jan 14 Python
简单介绍Python中用于求最小值的min()方法
May 15 Python
一篇文章搞懂Python的类与对象名称空间
Dec 10 Python
python url 参数修改方法
Dec 26 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
Python内置random模块生成随机数的方法
May 31 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
May 20 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
May 26 Python
opencv 实现特定颜色线条提取与定位操作
Jun 02 Python
opencv之颜色过滤只留下图片中的红色区域操作
Jun 05 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中设置时区,记录日志文件的实现代码
2013/01/07 PHP
php查询ip所在地的方法
2014/12/05 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
基于jQuery的一个扩展form序列化到json对象
2010/12/09 Javascript
JS代码判断IE6,IE7,IE8,IE9的函数代码
2013/08/02 Javascript
javascript实现颜色渐变的方法
2013/10/30 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
JavaScript创建对象方法实例小结
2018/09/03 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
新加坡鲜花速递/新加坡网上花店:Ferns N Petals
2020/08/29 全球购物
《少年王勃》教学反思
2014/04/27 职场文书
党员公开承诺书内容
2014/05/20 职场文书
求职意向书
2014/07/29 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
2016年教师新年寄语
2015/08/18 职场文书
八年级语文教学反思
2016/03/03 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
go语言中http超时引发的事故解决
2021/06/02 Golang