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

  

原文地址:https://www.cnblogs.com/qtclm/p/11959290.html

时间: 2024-11-05 16:11:06

python完成数组格式的请求参数的加密计算的相关文章

jmeter通过BeanShell 脚本,实现对http请求参数的加密

jmeter一直是一款很好的接口和性能测试工具,它是开源的,不需要为此支付任何费用,而且可以下载源码,可以在修改源代码并在此基础上拓展自己的功能或插件,它可以跟ant和jenkins结合起来搭建自己的自动化接口测试框架.它的好还在于它是纯JAVA开发的,因此,它可以更好的跟JAVA对接,通过引入自己封装的jar文件,可以方便的实现对jmeter各种个性化需求的功能的拓展,下面以一个实际例子来说明jmeter怎么引入自己开发的java工具类来实现对http请求参数的加密处理. 在此之前,我们假设有

Js生成接口请求参数签名加密

js生成接口请求参数签名加密 定义规则:将所有参数字段按首字母排序, 拼接成key1 = value1 & key2 = value2的格式,再在末尾拼接上key = appSecret, 再做MD5加密生成sign,方法如下: function getSign(params, kAppKey, kAppSecret) { if (typeof params == "string") { return paramsStrSort(params); } else if (type

从零开始设计SOA框架(三):请求参数的加密方式

第二章中说明请求参数有哪些,主要是公共参数和业务参数,服务端需要对参数进行效验,已验证请求参数的合法性 参数效验前先解释下以下参数: 1.参数键值对:包括公共参数.业务参数 1.公共参数:按键值对拼串,如time=123123app_id=sdf34234method=user.buyer.get等 2.系统参数: 1.如果是get请求则添加到公共参数后面 2.如果是post请求则需要服务端从form中获取 2.内部key:双方约定的秘钥,一般为app_secret 3.sign:键值对+内部k

请求参数MD5加密---函数助手

原文地址:https://www.cnblogs.com/QaStudy/p/11517971.html

请求参数的绑定 请求参数乱码问题

绑定的机制 表单中请求参数都是基于 key=value 的 SpringMVC 绑定请求参数的过程是通过   把表单提交请求参数,作为控制器中方法参数   进行绑定的 例如: <a href="account/findAccount?accountId=10">查询账户</a> 中请求参数是:   accountId=10 /** * 查询账户 * @return */ @RequestMapping("/findAccount") publ

获取URL中附带的请求参数的方式

在进行请求的时候,通常的方式是:request.getParametere("param");来获得我们想要的一些参数, 但是在现实的生活中我们需要自定义一些URL格式的请求参数,对这些格式的请求参数可能通过request.getParameter("param") 就不是十分的合适. 下面我们以http://www.yongit.com/device/md5/44CF9590006BF252F707?firstParam=gHdg5pU48rHTDknJ&

请求头鉴权、请求参数加密、返回值解密

(1)进行接口测试的时候,写好接口测试用例,然后模拟请求的时候,会出现请求头鉴权.给你了key值那么可以 import hashlibimport timeimport base64 def get_sha1(str_data): sha1_str = hashlib.sha1(str(str_data)).hexdigest() print sha1_str return sha1_str def get_md5(imsi): imsi_md5 = hashlib.md5() imsi_md5

python正则-字符串处理,主要用于处理请求参数格式为application/x-www-form-urlencoded的表单数据

#当提交的表单数据格式为application/x-www-form-urlencoded,直接从浏览器复制出来的格式是str_lin(chrome,也是最常见的)或者str_in2(火狐)这两种格式你会发现直接复制出来用python进行请求时不行的,所以需要对其进行处理,最终的格式key1=value1&key2=value2...这种格式#下面是实现代码,第三个方法是没事的时候花了点时间帮开发写的一个协助脚本,用于php调试请求import re str_in='''customer_typ

python接口自动化-参数关联和JSESSIONID(上个接口返回数据作为下个接口请求参数)

参数关联是接口测试和性能测试最为重要的一个步骤,很多接口的请求参数是动态的,并且需要从上一个接口的返回值里面取出来,一般只能用一次就失效了.最常见的案例就是网站的登录案例,很多网站的登录并不仅仅只传username和psw两个参数,往往有其它的动态参数.有时候还需要带上cookies参数,如JSESSIONID 登录参数 首先分析下目标网站[学信网:https://account.chsi.com.cn/passport/login]的登录接口请求参数.先随便输入账号和密码,使用fiddler工