前后端加密数据规范
前端目前使用CryptoJS加密库实现对敏感数据的加密。
假设当前需加密的数据是 ‘123456‘,加密后的数据就是 ‘BPryZTXjMsEzO4psJgVwpiAl9R+OkjuvYw==‘,后端拿到加密的数据,再进行解密,解密后得到的结果是 ‘123456‘。
具体的代码实现如下:
安装工具包
npm install crypto-js
项目中代码 (封装方法)
import CryptoJS from 'crypto-js'
// 加密key 需要与后端保持一致
const CRYPTOJSKEY = "AES73oDth02=" + getNowMMdd()
// 获取时间戳
export function getTimeStamp () {
return new Date().getTime(); //精确到毫秒
}
// aes加密
export function encryptAES (plaintText) {
// 如果传入的data是json对象,先转义为字符串
if (typeof plaintText === "object") {
try {
plaintText = JSON.stringify(plaintText)
} catch (error) {
console.log("error:", error)
}
}
let key = CryptoJS.enc.Utf8.parse(CRYPTOJSKEY)
let options = {
iv: key,
mode: CryptoJS.mode.CTR,
padding: CryptoJS.pad.NoPadding,
}
let encryptedData = CryptoJS.AES.encrypt(plaintText, key, options)
let encryptedBase64Str = encryptedData.toString()
return encryptedBase64Str
}
// aes解密
export function decryptAES (encryptedBase64Str) {
let vals = encryptedBase64Str
let key = CryptoJS.enc.Utf8.parse(CRYPTOJSKEY)
let options = {
iv: key,
mode: CryptoJS.mode.CTR,
padding: CryptoJS.pad.NoPadding,
}
let decryptedData = CryptoJS.AES.decrypt(vals, key, options)
let decryptedStr = CryptoJS.enc.Utf8.stringify(decryptedData)
return decryptedStr;
}
// 获取月日,格式为0102
export function getNowMMdd () {
let date = new Date();
let m = date.getMonth() + 1 + "";
let d = date.getDate() + "";
m = m < 10 ? "0" + m : m;
d = d < 10 ? "0" + d : d;
return m + d;
}
项目中调用
import { encryptAES, decryptAES, getTimeStamp } from '@/utils/index.js'
// 加密
let enValue = encryptAES('123456')
console.log(enValue)
// 解密
let deValue = decryptAES(enValue)
console.log(deValue)
// token加密比较特殊,需要多拼接'[time]'
let enToken = encryptAES('123456' + '[time]' + getTimeStamp())
console.log(enToken)
// token解密
let deToken = decryptAES(enToken)
console.log(deToken)
// 解密后得到的结果是 '123456[time]1640761192868',需要截取 '[time]' 前的数据。