接口簽名是我做接口測試撞到的第一塊石頭,剛到新公司,本來想默默憋出來一個大招,然后碰到了簽名接口,直接給跪了。於是只好找開發哥哥幫忙,把簽名算法的java文件拿到,一行行對着用python實現了一遍。大致的心路歷程就是這樣了,簽名其實沒什么好講的,每個公司實現都不一樣,java代碼轉成python代碼也要點時間,傳參類型和格式一定要對,調試的時候有人幫忙會快很多。
寫這篇文章的目的之一,是粗略介紹一下自定義關鍵字的寫法。另一目的是給有接口簽名的小伙伴提供一些思路,不至於被一個老是變的字段嚇到不敢前行。
有些小伙伴可能對簽名什么的沒有概念,那稍微解釋一下。簽名主要的作用是保證接口傳值的完整性,一致性和安全性,一般會將時間戳及重要字段做成一個簽名,作為一個參數傳入,服務端收到請求后,首先對簽名字段做校驗,校驗通過才做請求處理。在安全要求比較高一些的公司,比如金融行業,就會使用接口數字簽名。
由於我們不是設計簽名的,而只是翻譯開發代碼,就不考慮諸多細節了。假設簽名簽的字段為時間戳timestamp,重點字段:data1,data2,設備id:imei,簽名的key為一個客戶端和服務端約定的一個常量,如’abcd’。
算法過程如下:
- 對約定key值進行md5處理
- 將規定字段拼接成一個長字符串,拼接時用&符號做為連接,拼接前把字符格式都轉成了字符串
- 將第二步得到的字符串進行md5處理
以下是胡七八謅的python代碼,可運行:
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import hashlib import json class md5Enc(object): def get_sign(self,data1,data2,imei="",t=""): ''' Examples: ${sign} | Get Sign | api.name | ${userinfo} | 357070058113616 | ${t_now} ''' #key string key="abcd" #第一步,key md5 keyMd5 = hashlib.md5() keyMd5.update(key) keyMd5= keyMd5.hexdigest() data2Str = json.dumps(data2) #第二步拼接簽名 signBefore = data1 + "&" + data2Str + "&" + imei + "&" +\ t + "&" + keyMd5 #第三步sign md5 sign = hashlib.md5() sign.update(signBefore) sign = sign.hexdigest() return sign def get_pw_encrpt(self,pwBefore): '''write your encrpt code here''' print 'your encrpt code'
我的具體做法是把這個py文件命名為md5Enc.py(與類名一致)。py文件放在rf的項目文件里,如果和suite同級,以library的形式導入:
調用如下:
實際實踐中,除了簽名算法,還有密碼加解密算法等,套路都差不多,有一些很簡單的,只單純一個md5的加密,應該用不到自定義關鍵字,稍微復雜一點的多層加密,什么AES啊,SHA256啊,base64啊,就考慮自己寫寫代碼吧。