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

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

参考资料: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;
}
复制代码

 

 

posted @   expworld  阅读(4287)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2018-12-07 words
2018-12-07 DBUtils (30)
点击右上角即可分享
微信分享提示