AES加解密

320 阅读1分钟

前后端加密数据规范

前端目前使用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]' 前的数据。