vue对于路由参数进行加密处理
实现方式:stringifyQuery 和 parseQuery
// src\utils\encryption.js
// 按需引入 CryptoJS 需要的组件
const CryptoJS = require("crypto-js/core");
const Latin1 = require("crypto-js/enc-latin1");
const AES = require("crypto-js/aes");
const ZeroPadding = require("crypto-js/pad-zeropadding");
const Utf8 = require("crypto-js/enc-utf8");
const Base64 = require("crypto-js/enc-base64");
/*
* 加密 解密
*/
const baseCryptoCode = "********"; // 这个私钥每个项目指定一个唯一。更换密钥,请确认16位
const getKeyHex = (cryptoCode) => Latin1.parse(cryptoCode || baseCryptoCode);
const getIvHex = () => Latin1.parse(baseCryptoCode);
/**
* 加密
* @param {String} key
* @param {String} cryptoCode
* @returns {string}
*/
export const getEncrypt = (key, cryptoCode) => {
let keyHex = getKeyHex(cryptoCode);
let ivHex = getIvHex();
try {
key = JSON.stringify(key);
} catch (e) {
console.warn(e);
}
return AES.encrypt(key, keyHex, {
mode: CryptoJS.mode.CBC,
padding: ZeroPadding,
iv: ivHex,
}).toString();
};
/**
* 加密后转base64
* @param {String}} key
* @param {String} cryptoCode
*/
export const getEncryptToBase64 = (key, cryptoCode) => {
let encryptStr = getEncrypt(key, cryptoCode);
let wordArray = Utf8.parse(encryptStr);
return Base64.stringify(wordArray);
};
/**
* 解密
* @param data
* @returns {string}
*/
export const getDecrypt = (data) => {
let keyHex = getKeyHex();
let ivHex = getIvHex();
let decrypted = AES.decrypt(
{
ciphertext: Base64.parse(data),
},
keyHex,
{
mode: CryptoJS.mode.CBC,
padding: ZeroPadding,
iv: ivHex,
}
).toString(Utf8);
try {
decrypted = JSON.parse(decrypted);
} catch (e) {
console.warn(e);
}
return decrypted;
};
/**
* 对base64数据解密 先解析base64,在做解密
* @param {String} data
* @returns {string}
*/
export const getDecryptByBase64 = (data) => {
let parsedWordArray = Base64.parse(data);
let decryptStr = parsedWordArray.toString(Utf8);
return getDecrypt(decryptStr);
};
// src\utils\query.js
import {
getEncryptToBase64 as encrypt,
getDecryptByBase64 as decrypt,
} from "./encryption";
const encodeReserveRE = /[!'()*]/g;
const encodeReserveReplacer = (c) => "%" + c.charCodeAt(0).toString(16);
const commaRE = /%2C/g;
const encode = (str) =>
encodeURIComponent(str)
.replace(encodeReserveRE, encodeReserveReplacer)
.replace(commaRE, ",");
const decode = decodeURIComponent;
/**
* 判断字符串是否是base64
* @param { string } str
* @returns { boolean }
*/
function isBase64(str) {
if (str === "" || str.trim() === "") {
return false;
}
try {
return btoa(atob(str)) == str;
} catch (err) {
return false;
}
}
/**
* 序列化对象 并加密
* @param {Object} obj
*/
export const stringifyQuery = (obj) => {
const res = obj
? Object.keys(obj)
.map((key) => {
const val = obj[key];
if (val === undefined) {
return "";
}
if (val === null) {
return encode(key);
}
if (Array.isArray(val)) {
const result = [];
val.forEach((val2) => {
if (val2 === undefined) {
return;
}
if (val2 === null) {
result.push(encode(key));
} else {
result.push(encode(key) + "=" + encode(val2));
}
});
return result.join("&");
}
return encode(key) + "=" + encode(val);
})
.filter((x) => x.length > 0)
.join("&")
: null;
return res ? `?${encrypt(res)}` : "";
};
/**
* 解密 反序列化字符串参数
* @param {String}} query
*/
export const parseQuery = (query) => {
const res = {};
query = query.trim().replace(/^(\?|#|&)/, "");
if (!query) {
return res;
}
// 解密
query = isBase64(query) ? decrypt(query) : query;
query.split("&").forEach((param) => {
const parts = param.replace(/\+/g, " ").split("=");
const key = decode(parts.shift());
const val = parts.length > 0 ? decode(parts.join("=")) : null;
if (res[key] === undefined) {
res[key] = val;
} else if (Array.isArray(res[key])) {
res[key].push(val);
} else {
res[key] = [res[key], val];
}
});
return res;
};
在router/index.js添加一下代码:
import { stringifyQuery, parseQuery } from "@/utils/query";
const routes = [];
const router = new VueRouter({
mode: "history",
stringifyQuery: stringifyQuery, // 序列化query参数
parseQuery: parseQuery, // 反序列化query参数
routes,
});
export default router;
以下加密的效果:
加密:
解密后:
希望大佬看到有不对的地方,提出博主予以改正!

浙公网安备 33010602011771号