接口測試必備技能 - 加密和簽名
每天進步一點點,關注我們哦,每天分享測試技術文章
本文章出自【碼同學軟件測試】
碼同學公眾號:自動化軟件測試,領取資料可加:magetest
碼同學抖音號:小碼哥聊軟件測試
1、什么是加密以及解密?
加密:在網(wǎng)絡上傳輸?shù)脑紨?shù)據(jù)(明文)經(jīng)過加密后形成(密文)傳輸,防止被竊取。
解密:將加密還原成原始數(shù)據(jù)
2、加密方式分類?
對稱式加密:對加密和解密使用的是同一個密鑰
非對稱式加密:非對稱式加密需要兩個密鑰(雙鑰),分別叫公鑰和秘鑰,這兩把秘鑰可以互相加解密,公鑰公開的,不需要保密,私鑰是保密的。
01加密方式詳解
1、加對稱密技術:
DES加密算法:加密安全性弱,一般應用于舊的系統(tǒng)里面
AES加密算法:一般用于前后端分離的接口加密
Base64加密算法:編碼的方式
2、非對稱加密技術(RSA加密算法)
RSA加密算法:最有影響力的加密算法
場景1:通過公鑰加密
? ? ? ? ? ?通過私鑰解密
兩個用戶。A和B,B有雙鑰,A想要把一個數(shù)據(jù)報文通過加密的方式傳給B。
① B把自己的公鑰發(fā)送給A(公鑰是公開的)
② A使用這個公鑰把數(shù)據(jù)報文進行加密,加密完成傳給B(加密后的密文通過網(wǎng)絡傳給B)
③ B使用自己的秘鑰解密得到數(shù)據(jù)報文

場景2:私鑰加密:數(shù)字簽名
? ? ? ? ? ?公鑰解密:驗證簽名
數(shù)字證書由來:因為公鑰是公開的不安全,所以需要第三方的CA(數(shù)字證書頒發(fā)機構)對公鑰進行加密,加密后的東西就叫數(shù)字證書。數(shù)字證書包括:B用戶基本信息以及B公鑰的信息,部分證書也附有有效期。X509的標準
CA:雙鑰,通過私鑰加密
驗證簽名:身份驗證。
兩個用戶。A和B,B有雙鑰
① B把需要發(fā)送的數(shù)據(jù)報文通過私鑰加密。
② B找到CA把自己的公鑰做認證
③ CA就用自己的私鑰對B的公鑰和一些相關的信息一起加密,生成數(shù)字證書
④ CA就會把數(shù)字證書發(fā)給B
⑤ B將密文和數(shù)字證書都傳給A
⑥ A用CA的公鑰去解開數(shù)字證書,拿到B的公鑰,在使用公鑰解密密文,從而得到數(shù)據(jù)報文
Fiddler不能直接抓取https協(xié)議的數(shù)據(jù)報文,需要安裝一個數(shù)字證書
https協(xié)議=http協(xié)議+SSL安全傳輸協(xié)議
SSL安全傳輸協(xié)議:安全套接層。
NetScape(B)研發(fā),F(xiàn)iddler(A),CA把數(shù)字證書發(fā)到網(wǎng)上,數(shù)字證書生成器。
3、MD5(完全不考慮解密,也叫做哈希算法,散列算法)
Postman舉例:在Tests中
//獲得當前時間戳
new
times =
new Date().getTime()
//使用MD5加密
var
miwen?
=
CryptoJS
.MD5("admin").toString().toUpperCase()
Jmeter
函數(shù)助手:__digest
${__digest(MD5.admin,,,)}
免費領取碼同學軟件測試課程筆記+超多學習資料+完整視頻+面試題,可加微信:magetest
02接口簽名
1、什么是接口簽名?
使用用戶名,密碼,時間戳和所有的排序過的參數(shù)組合起來,再加密得到的字符串,字符串是唯一的有權訪問第三方金融接口的鑒權碼=sign接口簽名。
2、為什么要做接口簽名?
防偽裝攻擊
防篡改攻擊
防存放攻擊
防數(shù)據(jù)泄漏
3、如何做接口簽名,了解簽名的規(guī)則:
對所有的請求的參數(shù)按key按ASCII碼做升序排列。
{"
c
":"3","
b
":"
2
","
a
":"
1
"}
{"
1
":"
1
","
b
":"
2
"
,"
c
":"
3
"}
把參數(shù)名和參數(shù)值連接成字符串:
a
=
1&b=2&c=3
用申請到的appid和appsecret連接到字符串的頭部
appid
:
用戶名
appsecret
:
密碼
appid
=
admin&appsecret=123&a=1&b=2&c=3
用時間戳連接字符串的尾部
appid
=
admin&appsecret=123&a=1&b=2&c=3×tamp=124124252
然后再把這個字符串安裝32位的MD5加密,加密后再轉(zhuǎn)換成大寫。
sign
=
E48B34F95AE8001C99CB86A612538C04
10秒有效。
jmeter實現(xiàn)并且分裝成函數(shù)的話:自定義函數(shù) jave python
4、postman實現(xiàn)并且封裝成函數(shù):JavaScript
Pre-request-Script
//url=https://aaa/sss?com=aaa&nu=hhh&phone=jjjjj&show_appid=jj&showapi_timestamp={{time}}&showapi_sign={{sign}}
var
moment
=
require
('
moment
')
//獲取時間戳
c
o
nsole
.
log
(
request.url
);
//獲取請求信息
var
url
=
request
.
url
;
var
param
=
url
.
split
("
?
")[1]
//取到url的?后面的值,按照?分割,取前面就是0
if
(
param != null
)
{
? ?
{
? ?
var
time
=
moment
()
.format
("
YYYYMMDDHHmmss
")/
/取當天時間按照YYYYMMDDHHmmss形式顯示
? ?
pm
.
environment
.set
("
time
",
time
);
//postman 自帶的 ?全局變量
? ?
param
+
="
&showapi_timestamp=
"
+time
;
? ?
param
+
="
&showapi_sign=122344556
";
? ?
? ?
var
param
=
param
.
split
("
&
") ;
//分割變成一個list
? ?
param
.sort()
;//按照要求的方式進行排序a-z
? ?
var
keys
=
new
Array
(
param.length
);
? ?
var
values
=
new
Array
(
param.length
);
? ?
for
(
var i=0;i<param.length;i++
)
? ?{
? ? ? ?
keys
[
i
]=
param
[
i
].
split
("
=
")[
0
]
//取=前面的值
? ? ? ?
values
[
i
]=
param
[
i
].
split
("
=
")[
1
]
//取=后面的值
? ?}
? ?
var
str
=[]
? ?
for
(
var
p=0;p<keys.length;p++
)
//如果發(fā)現(xiàn)keys需要sign,就不參與驗簽
? ?{
? ? ? ?
if
(
key
s[p]==
"
showapi_sign
"||
values[p]==
"
{{time}}
")
? ? ? ?{
? ? ? ? ? ?
continue
;
? ? ? ?}
? ? ? ?
str
.
push
(
keys[p]+value[p]
);
? ?}
? ?
var
sign
=
str
.
join
("")
? ?sign =
sign
+"
sssss
";
//加密鑰
?
?pm.
environment
.set
(
"sign",CryptoJs.MD5(sign).toString()
);
//postman 自帶的全局變量
}

免費領取碼同學軟件測試課程筆記+超多學習資料+學習完整視頻 ? 可加:magetest/關注碼同學公眾號:自動化軟件測試
本文著作權歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權并注明出處。