加密介面怎麼測試?

2022-03-10 11:13:14 字數 3915 閱讀 5299

摘要演算法:

對明文編碼生成資訊摘要,以防止被篡改。比如md5使用的是hash演算法,無論多長的輸入,md5都會輸出長度為128bits的乙個串。

摘要演算法不要秘鑰,客戶端和服務端採用相同的摘要演算法即可針對同一段明文獲取一致的密文

對稱加密:

對稱加密演算法是共享金鑰加密演算法,在加密解密過程中,使用的金鑰只有乙個。傳送和接收雙方事先都知道加密的金鑰,均使用這個金鑰對資料進行加密和解密。

資料加密:在對稱加密演算法中,資料傳送方將明文 (原始資料) 和 加密金鑰一起經過加密處理,生成複雜的密文進行傳送。

資料解密:資料接收方收到密文後,使用加密的金鑰及相同演算法的逆演算法對加密的密文進行解密,將使其恢復成可讀明文。

非對稱加密

非對稱加密演算法,有兩個金鑰,乙個稱為公開金鑰 (publickey),另乙個稱為 私有金鑰 (private key),加密和解密使用的是兩個不同的金鑰,所以這種演算法稱為非對稱加密演算法。

如果使用公鑰對資料進行加密,只有用對應的私鑰才能進行解密。

如果使用私鑰對資料進行加密,只有用對應的公鑰才能進行解密。

常見加密演算法的處理方式

根據上述常見的加密演算法,測試人員在測試不同的加密介面可採用下述的方法處理加密介面

摘要演算法(md5.sha1 ):造介面資料前呼叫md5,sha1進行編碼,服務端對比編碼後的字串是否一致。

對稱加密演算法(aes,des ):造介面資料前從開發獲取對稱公鑰,基於對稱公鑰可以加密請求資料,解密響應報文。

非對稱加密演算法(rsa):造介面資料前從開發獲取公鑰私鑰去加密解密介面資料

使用者認證

一般的介面測試工具都會提供乙個user auth/authorization的選項,以postman為栗子,你可以看到以下的選項:

基本認證(basic auth)

摘要認證(digest auth)

oauth 1.0a

oauth 2.0(最常見,現在的**介面多數提供此使用者認證方式)

在對應的工具上,你可以選取對應的使用者認證選項,這裡cc先生主要介紹如果用python如何實現使用者認證。

1 首先安裝requests庫,requests庫的get()和post()方法均提供有auth引數,用於設定使用者簽名。

2 假定我們有乙個介面為新增乙個新的公告,介面需要認證:auth=("username","password")

nid 或 name兩個引數二選一

3 偽**:

def test_get_notice_list_nid_sucess(self):

auth_user = ('

admin

' , '

admin123456')

r = requests.get(self.base_url, auth = auth_user, params = )

result =r.json()

self.assertequal(result[

'status

'], 200

)....

數字簽名

在使用 http/soap 協議傳輸資料的時候,簽名作為其中乙個引數,可以起到關鍵作用:

先來乙個簡單的,通過客戶的金鑰,服務端的金鑰匹配;

這個很有好理解,例如乙個介面傳參為:

假設簽名的金鑰為:@signpassword

加上簽名之後的介面引數為:

但是,這樣的sign 引數明文傳輸是不安全的,一般會選擇一些加密演算法,比如md5 演算法(md5演算法是不可逆向的),比如md5**如下:

import hashlib

md5 =hashlib.md5()

sign_str = "

@signpassword

"sign_bytes_utf8 =sign_str.encode()

md5.update(sign_bytes_utf8)

sign_md5 =md5.hexdigest()

print(sign_md5)

執行後得到:6648e929329e53e7a91c50ae685a88b5

此時帶簽名的介面為:

所以,當伺服器接收到請求後,同樣需要對「signpassword」進行 md5 加密,然後,比對與呼叫者傳來的 sign 加密串是否一致,從而來鑑別呼叫者是否有許可權使用該介面。

接著,我們來理解乙個複雜一點的:把sign引數傳遞為api key(申請獲取)+timestramp(時間戳)同樣需要 用**來實現,原理和上面這個一致的。(偽**)

def setup(self):

self.base_url = "

"self.api_key = "

&apikey

"# 當前時間

python裡面有乙個很好的黑魔法,叫pycrypto庫,支援常見的 des、aes 加密以及 md5、sha 各種 hash 運算。

對於aes的加密來說,看一下用了pycrypto庫的結果

加密:

from

crypto.cipher import aes# 加密

obj =aes.new('

this is a key123

', aes.mode_cbc, '

this is an iv456')

message = "

the answer is no

"ciphertext =obj.encrypt(message)

print(ciphertext)

程式執行後的結果為:b'\xd6\x83\x8dd!vt\x92\xaa`a\x05\xe0\x9b\x8b\xf1'

aes加密裡面有兩個關鍵,乙個是key(必須為16,24,32位),乙個是vi(必須為16位)

解密:解謎者必須要同時知道key和vi才可以解密

obj2 = aes.new('

this is a key123

', aes.mode_cbc, '

this is an iv456')

s =obj2.decrypt(ciphertext)

print(s)

pip install pycrytodome
pycryptodome官方文件:

下面以jmete為例介紹如何實現加密介面的處理,針對這種介面測試的時候,在發起請求以前,我們需要對介面進入如下特殊處理:

1.和開發溝通介面加密的演算法以及需要的資訊,如果是sha加密,和開發溝通獲取加密的秘鑰,以及加密和編碼的關鍵字串

2.在發起介面請求以前,對介面明文資料進行預處理,在jmeter的介面實現中,可以通過新增beanshell指令碼,在beanshell指令碼中基於上乙個步驟獲取到的資訊,採用和服務端相同的加密方法和加密流程對介面明文進行加密和編碼

3.基於加密後的密文發起加密請求

介面加密測試

一般介面開發中有以下常用的幾種安全機制 使用者認證 一般的介面測試工具都會提供乙個user auth authorization的選項,以postman為例子,你可以看到以下的選項 在使用 http soap 協議傳輸資料的時候,簽名作為其中乙個引數,可以起到關鍵作用 先來乙個簡單的,通過客戶的金鑰...

加密介面如何測試?

隨著網際網路技術的發展,服務安全性和資料安全性變的越來越重要,提供介面服務的系統往往會應用各種加密技術,保證介面的安全呼叫,如何應用工具來實現加密介面測試成為一項必要技能。在講解如何用jmeter實現介面安全性測試之前,先來了解一下常見的加密演算法,測試同學可根據不同的加密演算法型別和程式猿 程式猿...

介面測試怎麼進行,如何做好介面測試

介面測試主要用於外部系統與系統之間以及內部各個子系統之間的互動點,定義特定的互動點,然後通過這些互動點來,通過一些特殊的規則也就是協議,來進行資料之間的互動。1 webservice介面 是走soap協議通過http傳輸,請求報文和返回報文都是xml格式的,我們在測試的時候都用通過工具才能進行呼叫,...