需求:對公司項目敏感數據,使用前后端進行接口加密處理。
參考資料:https://www.jianshu.com/p/a47477e8126a (采用的是 AES
+ BASE64
算法加密)
依賴導入:
import './core.js'
import './md5.js'
掃盲:
crypto-js 是一個純 javascript 寫的加密算法類庫 ,可以非常方便地在 javascript 進行 MD5、SHA1、SHA2、SHA3、RIPEMD-160 哈希散列,進行 AES、DES、Rabbit、RC4、Triple DES 加解密。
這里我們使用它的MD5加密方法。
CryptoJS.MD5(signStr)
公共請求參數:
參數名 | 值類型 | 說明 |
---|---|---|
function | string | 固定值,參見每個接口定義 |
app_id | string | 應用id |
_sign | string | 簽名,見簽名算法 |
_u_token | string | 用戶token,如沒有則不傳或傳”” |
sn | int | 毫秒時間戳 |
>>>>>> 參數加密方法 getEncryptParams
function getEncryptParams(params) { //params遍歷,如果屬性為空,則不傳 params = filterParams(params) var timestamp = Math.round(new Date().getTime()).toString(); //通過request.data獲取body的內容,這個是postman內置變量 // var param = request.data; // request.data["sn"] = timestamp; params = Object.assign({}, params, { sn: timestamp, app_id: "XXXX"}) var appSecret = "XXXXXXXXXgrvVGcfkO8Mzh0pSCsPxXXXXXXX"; // var sign = md5Sign(params, appSecret); var signStr = sign(params, appSecret); var result = params = Object.assign({}, params, { _sign: signStr, app_id: "21016" }) var formData = new FormData(); for (let key in result) { formData.append(key, result[key]) } return result; }
簽名算法(舉栗子):
1、對所有請求參數名按ASCII正序排序 2、將排序后的請求參數做拼接生成字符串:key1 + value1 + key2 + value2 + … 如value為null則不拼接 如value是true/false,
則先轉成1/0,true為1,false為0 如value為字典/數組,則先對value進行處理,處理方式同(2):key1 + value1 + key2 + value2 + … 3、對2得到的字符串進行md5(大寫),然后拼接上密鑰 4、對3得到的字符串進行md5(大寫)
生成簽名方法 sign
function sign(data, appSecret) { var SORT_STRING; var signData = ksort(data, ""); if (typeof data.sign != "undefined" && data.sign !== null) { delete signData.sign; } var signStr = createLinkstring(signData); var m5 = CryptoJS.MD5(signStr).toString(); var signs = CryptoJS.MD5(m5.toUpperCase() + appSecret) .toString() .toUpperCase(); return signs; }
無效參數過濾方法 filterParams
function filterParams(obj){ let _newPar = {}; for (let key in obj) { //如果對象屬性的值不為空,就保存該屬性(如果屬性的值為0,保存該屬性。如果屬性的值全部是空格,屬於為空。) if ((obj[key] === 0 || obj[key]) && obj[key].toString().replace(/(^\s*)|(\s*$)/g, '') !== '') { //記錄屬性 _newPar[key] = obj[key]; } } //返回對象 return _newPar; }