vue中AES加密解密

本文介绍了在Vue项目中使用CryptoJS库进行AES加密解密的步骤,包括安装插件、封装加密解密方法以及在实际应用中的使用。重点提到加密时需将数据转换为JSON格式,以及解密时可能出现的问题和解决方案,如数据完整性问题和回车换行字符的影响。

记录一下vue的AES加密解密

第一步:安装插件
npm install crypto-js
第二步:封装方法到公共文件中

AES 加密有EBC、CBC两种模式;前者是基础的加密模式,后者是循环模式,更安全。
这里要注意下,秘钥需要设置成16位的字符串,加密解密的秘钥要一致

import CryptoJS from 'crypto-js/crypto-js'

加密这里我用了一个JSON.stringify()方法,我看网上的好多都没有这一步,可能是我需要加密的数据是json格式。json格式的数据加密时,如果不把传过来的数据转一下,加密出来的密文就无法被解密;而且密文也很奇怪,就很短;这里就随机应变吧,如果不加,密文正常,可以解密成功,就是可以的。补充一下,如果加密的数据不是json格式就不需要JSON.stringify()方法转义。

// 加密 这里使用的是CBC模式 必须要设置偏移量
export function encryptData (encryptData) {
  // const data = CryptoJS.enc.Utf8.parse(password.toString()) // 转义非json数据的写法
  const data = CryptoJS.enc.Utf8.parse(JSON.stringify(encryptData)) // 转义一下数据
  const key = CryptoJS.enc.Utf8.parse('test20230221o') // 秘钥 需要设置16位
  const iv = CryptoJS.enc.Utf8.parse('test20230221o') // 偏移量
  const encrypted = CryptoJS.AES.encrypt(data, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC
  })
  return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
};

下面是两种解密方法,

// 解密方法一:
export function decryptData (decryptStr, keyStr, ivStr) {
  const decryptBase64Str = CryptoJS.enc.Base64.parse(decryptStr)
  const key = CryptoJS.enc.Utf8.parse('test20230221o') // 密钥 需要与加密秘钥保持一致
  const iv = CryptoJS.enc.Utf8.parse('test20230221o') // 密钥偏移量
  const createCode = CryptoJS.lib.CipherParams.create({ ciphertext: decryptBase64Str }) // 将密文转换成 WordArray 对象
  const decryptedData = CryptoJS.AES.decrypt(createCode, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  })
  const decryptedStr = CryptoJS.enc.Utf8.stringify(decryptedData).toString()
  console.log('9999', decryptedStr)
  return decryptedStr
};
// 解密方法二:
export function decrypt (encryptedData) {
  const key = CryptoJS.enc.Utf8.parse('digital20230221o')
  const iv = CryptoJS.enc.Utf8.parse('digital20230221o')
  const decrypted = CryptoJS.AES.decrypt(encryptedData, key,
    {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    })
  return decrypted.toString(CryptoJS.enc.Utf8)
}

其中 CryptoJS.enc.Utf8.parse()将字符串以 utf8 的格式,转化为 WordArray 对象;CryptoJS.lib.CipherParams.create()生成一个CipherParams对象,这里需要用cypherText属性将加密数据转换为cypherParam,作为第一参数,可以避免触犯parse方法。
上述两种方法都可以实现解密。这里提个醒,如果接口传过来的加密数据,在解密过程中发现解密出来的数据不太完整或者数据不对的情况,可以让后端看一下是不是加密的数据多了回车换行字符;我当时写第一种方法解密,一直出现数据不完整的情况,还以为是这样解密不行,就写了第二种,还是不行;后来发现后端的数据多了回车换行字符。
另:其实还是不太懂创建CipherParams对象和不创建CipherParams对象有什么最直观的区别,反正如果一种方法不行就试一试第二种。

第三步:引用方法

哪里需要就在哪里引用,举一个简单的示例:

import { encryptData, decryptData } from '@/utils/encryption.js'
export default {
  data () {
    return {
      data: ''
    }
  },
  created () {
  },
  methods: {
    // 加密
    encryptData () {
      const enData = {
        name: 'lisa',
        age: 18,
        class: 5
      }
      console.log('enData', enData)
      this.data = encryptData(enData)
      console.log('加密后的数据:', this.data)
    },
    // 解密
    decryptData1 () {
      const deData = decryptData(this.data)
      // 转json格式
      const endData = JSON.parse(deData)
      console.log('最终的数据结果:', endData)
    }
  }
}
### Vue2 中实现 AES 加密与解密的示例代码 在 Vue2 项目中实现 AES 加密和解密功能,可以借助 `crypto-js` 库。以下是完整的实现方式,包括加密和解密的函数定义以及如何在 Vue 组件中调用这些函数。 #### 安装依赖 首先需要安装 `crypto-js` 库: ```bash npm install crypto-js ``` #### 创建 AES 加密解密工具文件 创建一个工具文件 `aesUtils.js` 来封装 AES 的加密和解密逻辑: ```javascript // aesUtils.js import CryptoJS from 'crypto-js'; // 定义密钥和向量(确保前后端一致) const KEY = CryptoJS.enc.Utf8.parse('0123456789123456'); // 16字节密钥 const IV = CryptoJS.enc.Utf8.parse('0123456789123456'); // 16字节向量 // CBC 模式加密 export function encryptByCBC(data) { const encrypted = CryptoJS.AES.encrypt(data, KEY, { iv: IV, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encrypted.toString(); } // CBC 模式解密 export function decryptByCBC(data) { const decrypted = CryptoJS.AES.decrypt(data, KEY, { iv: IV, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return CryptoJS.enc.Utf8.stringify(decrypted).toString(); } // ECB 模式加密 export function encryptByECB(data, keyStr = '默认密钥') { const key = CryptoJS.enc.Utf8.parse(keyStr); const srcs = CryptoJS.enc.Utf8.parse(data); const encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return encrypted.toString(); } // ECB 模式解密 export function decryptByECB(data, keyStr = '默认密钥') { const key = CryptoJS.enc.Utf8.parse(keyStr); const decrypted = CryptoJS.AES.decrypt(data, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return CryptoJS.enc.Utf8.stringify(decrypted).toString(); } ``` #### 在 Vue2 组件中使用 AES 加密解密 以下是一个 Vue2 组件的示例,展示如何调用上述工具函数进行加密和解密: ```vue <template> <div> <h3>AES 加密解密示例</h3> <p>原始数据:{{ originalData }}</p> <p>CBC 加密后:{{ cbcEncryptedData }}</p> <p>CBC 解密后:{{ cbcDecryptedData }}</p> <p>ECB 加密后:{{ ecbEncryptedData }}</p> <p>ECB 解密后:{{ ecbDecryptedData }}</p> </div> </template> <script> // 引入 AES 工具函数 import { encryptByCBC, decryptByCBC, encryptByECB, decryptByECB } from '@/utils/aesUtils'; export default { data() { return { originalData: 'Hello, AES!', // 原始数据 cbcEncryptedData: '', // CBC 加密后的数据 cbcDecryptedData: '', // CBC 解密后的数据 ecbEncryptedData: '', // ECB 加密后的数据 ecbDecryptedData: '' // ECB 解密后的数据 }; }, created() { // 调用 CBC 加密和解密 this.cbcEncryptedData = encryptByCBC(this.originalData); this.cbcDecryptedData = decryptByCBC(this.cbcEncryptedData); // 调用 ECB 加密和解密 this.ecbEncryptedData = encryptByECB(this.originalData); this.ecbDecryptedData = decryptByECB(this.ecbEncryptedData); } }; </script> ``` #### 注意事项 - 密钥(`KEY`)和初始化向量(`IV`)必须与后端保持一致,否则会导致解密失败[^3]。 - 使用 CBC 模式时需要提供 `IV` 参数,而 ECB 模式不需要[^4]。 - 如果密钥长度不足 16 字节,可能会导致加密或解密失败[^3]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值