1. 程式人生 > >介面測試 +RSA 加密

介面測試 +RSA 加密

public static String sign(byte data, final String privateKey) throws Exception {
    byte keyBytes = Base64Utils.decrypt(privateKey);
    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
    Signature signature = Signature.getInstance("MD5withRSA");
    signature.initSign(privateK);
    signature.update(data);
    return Base64Utils.encrypt(signature.sign());
}

具體的python函式如下:

import hashlib
import base64
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA
from Crypto.Hash import MD5

priKey = '''-----BEGIN RSA PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAN8M7oBSoZOzAoxL3tmzku/ZTtQn/BBqfe8jj0GZeFKh0IY8qDpFrNONzxp4S+TH4xCXYyEFkkEIcS9SKMCbqba
-----END RSA PRIVATE KEY-----'''

def sign(self, signdate):
        reload(sys)
        sys.setdefaultencoding('utf-8')
        h=MD5.new(signdate)
        signer = PKCS1_v1_5.new(RSA.importKey(priKey))
        signn = signer.sign(h)
        signn=base64.urlsafe_b64encode(signn)
        return signn

priKey是私鑰,每個公司的私鑰是不一樣的。

在robotframework中匯入自己寫的py檔案就可以呼叫sign了,但是這個簽名結果後面多了一個‘=’,需要加一步替換,把=替換為空,
 

替換.PNG


在python內建的base64庫中,可以直接進行編碼,base64.b64encode,但是編碼後的資料可能會出現‘+’或者‘/’,這在rul中是不能作為引數的,而base64.rulsafe_b64encode則把‘+’或‘/’轉換成‘-‘或者’_‘。具體編碼函式看需求,如果是做url則必須用urlsafe
Base64是一種通過查表的編碼方法,不能用於加密,即使使用自定義的編碼表也不行。
Base64適用於小段內容的編碼,比如數字證書籤名、Cookie的內容等。
由於=字元也可能出現在Base64編碼中,但=用在URL、Cookie裡面會造成歧義,所以,很多Base64編碼後會把=去掉,這也就是上面提到的為什麼多了一個’=‘。

get。
介面測試第一步是建立session,第一個引數是alias,也就是命名,識別用的,第二個引數為url,第二行為rsa加密,看需要,第五行是建立標頭檔案(具體引數看公司需求),第六行是引數變數,第八行即為連線api,第一個引數是alias,需要跟上面的保持一致,第二個引數是uri,第三第四為標頭檔案跟引數變數
 

get.PNG


 
post
post跟get基本一致,在post需要注意介面傳參是用data還是用params。params是在請求url裡的引數,而data是請求body裡的,可以是json,也可以是urlencoded,試具體情況而定(經雪霽大神指正)。

pos.PNG



data如下,其實也就是把params改成data
 

post——data.png


 
使用params還是data對簽名也有影響,使用params時,簽名需要把所有引數附上,而且得按字母排序,用data時就不用加上引數。(本公司RSA加密的簽名規則是這樣,其他公司的具體的就不知道了,不懂得可以問問公司開發人員)具體如下:

/public/corporate/fund/proposa?fundCode=${fundCode}&investmentAmount=${investmentAmount}&x-api-key=I&x-api-timestamp=${timestamp}&x-api-version=2.0
/public/corporate/fund?x-api-key=I&x-api-timestamp=${timestamp}&x-api-version=2.0

在我這裡,rsa加密,如果引數是json格式,那麼在加密的時候是不需要加引數的,引數直接在post request用data進行傳輸,資料在這裡有一個需要注意的地方,那就是

{
  "accountNumber": "IF2016070100000044",
  "corporateUserCode": 0,
  "investorPayId": 28,
  "merchantNumber": "IF2017112100003",
  "password": "if123",
  "payMethod": 0,
  "purchaseFunds": [
    {
      "currency": "156",
      "fundCode": "0408",
      "investmentAmount": 10
    }
  ],
  "riskConfirmed": 1
}

json裡面有沒有出現數組,即有沒有出現中括號’[’,‘ ]‘,有的話,需要先進行create dictionary 之後再進行create list,這樣傳輸的資料才能正確。

時間戳:
獲取當前時間的時間戳為:${date} get time epoch;get time 是內建庫BuiltIn的關鍵字
把時間轉成時間戳:${date} Convert Date 2017-11-22 10:00:00 epoch;Convert Date是Date Time庫的關鍵字
把時間戳轉成時間:${date} get time ‘空一格’ ${time};注意在空一格那位置上空一格。。