zoukankan      html  css  js  c++  java
  • 【完整版】前端签名加密算法

    需求:对公司项目敏感数据,使用前后端进行接口加密处理。

    参考资料: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;
    }
  • 相关阅读:
    17. Letter Combinations of a Phone Number
    16. 3Sum Closest
    15. 3Sum
    14. Longest Common Prefix
    13. Roman to Integer
    12. Integer to Roman
    11. Container With Most Water
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
  • 原文地址:https://www.cnblogs.com/ivan5277/p/12003796.html
Copyright © 2011-2022 走看看