前端同学在写项目时 大多项目使用的安全手段都是token,这种方式对前端后端来说都无疑是繁琐且安全性不高的方案。
对于安全较要求高的项目 往往推荐Aes加密方式
npm i crypto-js
引入 crypto-js 包
import CryptoJS from 'crypto-js'
const strKey=""; //十六位十六进制数作为密钥
const iv= ''; //十六位十六进制数作为偏移量
// 加密函数
function encrypt(str) {
var key1 = CryptoJS.enc.Utf8.parse(strKey);
var iv1 = CryptoJS.enc.Utf8.parse(iv);
var encrypted = CryptoJS.AES.encrypt(str, key1, {
iv: iv1,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
//解密
function decrypt(str) {
var key1 = CryptoJS.enc.Utf8.parse(strKey);
var iv1 = CryptoJS.enc.Utf8.parse(iv);
var decrypt = CryptoJS.AES.decrypt(str, key1, {
iv:iv1,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypt.toString(CryptoJS.enc.Utf8);
}
//加密
encrypt('只能传入字符串')
//解密
decrypt('只能传入字符串')
字典排序函数
function ksort(o) {
let str = '';
let keys = Object.keys(o);
keys.sort();
keys.forEach((key)=>{
str+=`${key}=${o[key]}&`;
})
// 加密
return CryptoJS.MD5(str.substr(0, str.length - 1)).toString();
}
ksort(传入对象)
这里使用时间戳和随机数+data数据 然后md5加密 作为sing
import {baseUrl} from "@/common/config.js"
// 加密
import CryptoJS from 'crypto-js'
const strKey=""; //十六位数作为密钥
const iv= ''; //十六位数作为偏移量
// 加密函数
function encrypt(str) {
var key1 = CryptoJS.enc.Utf8.parse(strKey);
var iv1 = CryptoJS.enc.Utf8.parse(iv);
var encrypted = CryptoJS.AES.encrypt(str, key1, {
iv: iv1,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
//解密
function decrypt(str) {
var key1 = CryptoJS.enc.Utf8.parse(strKey);
var iv1 = CryptoJS.enc.Utf8.parse(iv);
var decrypt = CryptoJS.AES.decrypt(str, key1, {
iv:iv1,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypt.toString(CryptoJS.enc.Utf8);
}
// 对象按照key排序
function ksort(o) {
let str = '';
let keys = Object.keys(o);
keys.sort();
keys.forEach((key)=>{
str+=`${key}=${o[key]}&`;
})
// 加密
return CryptoJS.MD5(str.substr(0, str.length - 1)).toString();
}
const timeout = 3000;
function request({
url,
method,
data={},
}) {
return new Promise((resolve, reject) => {
// 请求数据
let timestampV = new Date().getTime(),
verifyV = Math.floor( (Math.random()*(20000-100)+100) ),
accountV = uni.getStorageSync('accountid'),
aesObj={
'timestamp':timestampV,
'verify':verifyV,
'account_id':accountV,
'sign':'',
};
aesObj.sign=ksort({
'timestamp':timestampV,
'verify':verifyV,
...data,
});
console.log(JSON.stringify(aesObj))
var headers = {
'appid': '58949fscdb14e373',
'token':encrypt(JSON.stringify(aesObj)),
};
return uni.request({
url: baseUrl + url,
data,
method:method.toUpperCase(),
timeout,
header:headers,
success: (res) => {
resolve(res.data)
},
fail: (err) => {
reject(err)
},
complete(){
}
})
})
}
//暴露
export {
request
}
//使用
import {
request
} from "@/common/request.js"
export const test= data => {
return request({
url: "/test/index",
method: "post",
data,
});
}
test()