为了加强项目的接口安全程度,需求如下

1 var options = {
2 // 前端需要传送的数据加密
3 data: {
4 abc: 123,
5 bcd: 123,
6 cds: '撒旦教付货款12313',
7 },
8 // 模拟后端返回base64码
9 key: 'NWxCZUZ3YWlE'
10 }
11 var test = function (option) {
12 //定义时添加VAR表示是私有属性 内部使用
13 var data = option.data; // 前端传送的数据
14 var key = option.key; // base64
15 // 前端对数据做ascii码排序
16 var sort_ASCII = function (obj) {
17 if (obj == null) return '';
18 var arr = new Array();
19 var num = 0;
20 for (var i in obj) {
21 arr[num] = i;
22 num++;
23 }
24 var sortArr = arr.sort();
25 var sortObj = {};
26 for (var i in sortArr) {
27 sortObj[sortArr[i]] = obj[sortArr[i]];
28 }
29 return sortObj;
30 }
31 // 对象封装 将data转译成字符串
32 var changeUrl = function (obj) {
33 if (obj == null) return '';
34 var str = ""
35 var n = 0;
36 Object.keys(sort_ASCII(obj)).forEach(key => {
37 // if (!isNaN(obj[key])) {
38 // str += (n ? '&' : '') + key + '=' + obj[key];
39 // n++
40 // }
41 if (!/.*[\u4e00-\u9fa5]+.*$/.test(obj[key])) {
42 str += (n ? '&' : '') + key + '=' + obj[key];
43 n++
44 }
45 })
46 return str
47 }
48 // 字符串与位异或封装
49 var stringToChars = function (_s, _num) {
50 var _r = "";
51 for (var i = 0; i < _s.length; i++) {
52 _r += String.fromCharCode(_s.charCodeAt(i) ^ _num);
53 }
54 return _r.trim().replace(/\s/g, "");
55 }
56 // 封装内部计算方式
57 var remainder = function (str) {
58 var num = Math.pow(2, str.length % 3 + 1);
59 return stringToChars(changeUrl(data), num)
60 }
61 // 方法前加this表示公共方法 可以在外部访问
62 // 获取前后端密钥
63 this.getSignature = function () {
64 var code = stringToChars(key, 2)
65 var n = Math.pow(2, code.length % 3);
66 code = stringToChars(md5(code), n)
67 // md5加密前后密钥
68 return md5(remainder(changeUrl(data)) + code)
69 }
70 }
71 var t = new test(options);
72 // 生成最后的签名
73 console.log(t.getSignature());
版权声明:本文为小乐9924的原创文章,转载请附上原文出处链接及本声明。