zoukankan      html  css  js  c++  java
  • python完成数组格式的请求参数的加密计算

    #输入
    '''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('
    ')#以换行符分隔字符串并转换位列表
                input_list=[a for a in input_list_source 
                    if (search_sign_str or '%ss'%(search_sign_str) ) not in a]#列表过滤字段sign
                out_str='
    '.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='
    '.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)+'
    '+input_out_list_other_str
                join_course_str_list=sorted(join_course_str.split('
    '))#对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=(',', ':')

      

  • 相关阅读:
    [置顶网]POWER 9为云与智能打造强大引擎
    [丁香医生]百亿保健帝国权健,和它阴影下的中国家庭---保存一下
    【菜鸟】RESTful 架构详解
    搞笑三问
    [置顶网] 世界服务器出货量
    [51CTO]新说MySQL事务隔离级别!
    Win2008r2 由ESXi 转换到 HyperV的处理过程
    Postgresql迁移数据文件存放位置
    极简版 卸载 home 扩充 根分区--centos7 xfs 文件格式
    CentOS下面磁盘扩容处理
  • 原文地址:https://www.cnblogs.com/qtclm/p/11959290.html
Copyright © 2011-2022 走看看