1、什么是加密以及解密?
加密:在網絡上傳輸的原始數據(明文)經過加密后形成(密文)傳輸,防止被竊取。
解密:將加密還原成原始數據
2、加密方式分類?
對稱式加密:對加密和解密使用的是同一個密鑰
非對稱式加密:非對稱式加密需要兩個密鑰(雙鑰),分別叫公鑰和秘鑰,這兩把秘鑰可以互相加解密,公鑰公開的,不需要保密,私鑰是保密的。
01
加密方式詳解
1、加對稱密技術:
DES加密算法:加密安全性弱,一般應用于舊的系統里面
AES加密算法:一般用于前后端分離的接口加密
Base64加密算法:編碼的方式
2、非對稱加密技術(RSA加密算法)
RSA加密算法:最有影響力的加密算法
場景1:通過公鑰加密
? ? ? ? ? ?通過私鑰解密
兩個用戶。A和B,B有雙鑰,A想要把一個數據報文通過加密的方式傳給B。
① B把自己的公鑰發送給A(公鑰是公開的)
② A使用這個公鑰把數據報文進行加密,加密完成傳給B(加密后的密文通過網絡傳給B)
③ B使用自己的秘鑰解密得到數據報文
場景2:私鑰加密:數字簽名
? ? ? ? ? ?公鑰解密:驗證簽名
數字證書由來:因為公鑰是公開的不安全,所以需要第三方的CA(數字證書頒發機構)對公鑰進行加密,加密后的東西就叫數字證書。數字證書包括:B用戶基本信息以及B公鑰的信息,部分證書也附有有效期。X509的標準
CA:雙鑰,通過私鑰加密
驗證簽名:身份驗證。
兩個用戶。A和B,B有雙鑰
① B把需要發送的數據報文通過私鑰加密。
② B找到CA把自己的公鑰做認證
③ CA就用自己的私鑰對B的公鑰和一些相關的信息一起加密,生成數字證書
④ CA就會把數字證書發給B
⑤ B將密文和數字證書都傳給A
⑥ A用CA的公鑰去解開數字證書,拿到B的公鑰,在使用公鑰解密密文,從而得到數據報文
Fiddler不能直接抓取https協議的數據報文,需要安裝一個數字證書
https協議=http協議+SSL安全傳輸協議
SSL安全傳輸協議:安全套接層。
NetScape(B)研發,Fiddler(A),CA把數字證書發到網上,數字證書生成器。
3、MD5(完全不考慮解密,也叫做哈希算法,散列算法)
Postman舉例:在Tests中
//獲得當前時間戳
new times = new Date().getTime()
//使用MD5加密
var miwen?=
CryptoJS.MD5("admin").toString().toUpperCase()
Jmeter
函數助手:__digest
${__digest(MD5.admin,,,)}
02
接口簽名
1、什么是接口簽名?
使用用戶名,密碼,時間戳和所有的排序過的參數組合起來,再加密得到的字符串,字符串是唯一的有權訪問第三方金融接口的鑒權碼=sign接口簽名。
2、為什么要做接口簽名?
防偽裝攻擊
防篡改攻擊
防存放攻擊
防數據泄漏
3、如何做接口簽名,了解簽名的規則:
對所有的請求的參數按key按ASCII碼做升序排列。
{"c":"3","b":"2","a":"1"}
{"1":"1","b":"2","c":"3"}
把參數名和參數值連接成字符串:
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加密,加密后再轉換成大寫。
sign=E48B34F95AE8001C99CB86A612538C04
10秒有效。
jmeter實現并且分裝成函數的話:自定義函數 jave python
4、postman實現并且封裝成函數: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')//獲取時間戳
console.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("&") ;//分割變成一個listparam.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++)//如果發現keys需要sign,就不參與驗簽
{
if (keys[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 自帶的全局變量}