基於python實現陣列格式引數加密計算
阿新 • • 發佈:2020-04-22
程式碼示例
#輸入 '''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_tel":"13130999884",{"join_tel":"13130999885","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,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,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=(',':')
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。