【完整版】前端簽名加密算法


需求:對公司項目敏感數據,使用前后端進行接口加密處理。

參考資料: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;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM