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=(',', ':')

      

  • 相关阅读:
    springmvc
    POJ 3683 Priest John's Busiest Day
    POJ 3678 Katu Puzzle
    HDU 1815 Building roads
    CDOJ UESTC 1220 The Battle of Guandu
    HDU 3715 Go Deeper
    HDU 3622 Bomb Game
    POJ 3207 Ikki's Story IV
    POJ 3648 Wedding
    HDU 1814 Peaceful Commission
  • 原文地址:https://www.cnblogs.com/qtclm/p/11959290.html
Copyright © 2011-2022 走看看