中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python怎么實現數組格式參數加密計算

發布時間:2020-08-01 11:44:59 來源:億速云 閱讀:143 作者:小豬 欄目:開發技術

小編這次要給大家分享的是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=(',', ':')

看完這篇關于python怎么實現數組格式參數加密計算的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

连平县| 大姚县| 柘荣县| 达日县| 丹东市| 大洼县| 九龙城区| 寿光市| 旬阳县| 梁河县| 开封县| 河北省| 平舆县| 布尔津县| 保康县| 湟源县| 句容市| 沂水县| 东安县| 清水县| 海兴县| 法库县| 北宁市| 泰州市| 东海县| 仪征市| 天气| 富平县| 宣恩县| 马山县| 砀山县| 镇平县| 平湖市| 昌江| 神农架林区| 平远县| 塔河县| 连山| 上杭县| 凤阳县| 罗城|