VUE---公钥私钥加密解密

最近在开发一些项目,前后端数据分离开发项目,涉及到数据的安全性,需要考虑:

1、前端提交数据,进行加密,后端解密。

2、前端渲染数据,进行解密,后端加密。

第一步:生成加密/解密公钥和私钥。

先生成解密用的私钥:

openssl genrsa -out crypt.pem 2048

然后生成加密用的公钥:

openssl rsa -in crypt.pem -outform PEM -pubout -out crypt-pub.pem

然后就生成了两个文件:

在线生成的方式方法:

http://web.chacuo.net/netrsakeypair
https://www.myssl.cn/tools/merge-pem-cert.html

具体实现代码,参考:

https://www.cnblogs.com/JQstronger/p/rsa_vue.html
https://blog.csdn.net/weixin_34256074/article/details/91373035

以上这种方式,使用证书进行加密和解密,安全性极高,但是加密和解密的过程相对会比较慢,故可以考虑安全性略低的一种加密方式:AES

AES 加密的模式有两种:EBC,CBC:

1、EBC: 是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。

2、CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。(不容易主动攻击,安全性好于ECB,是SSL、IPSec的标准)。

使用方法:

第一步:安装:crypto

npm install crypto-js --save-dev

第二步:utils / crypto.js

import CryptoJS from 'crypto-js'

// 需要和后端一致
const KEY = CryptoJS.enc.Utf8.parse('1234567890123456');
const IV = CryptoJS.enc.Utf8.parse('1234567890123456');

export default {

  /**
   * 加密
   * @param {*} word
   * @param {*} keyStr
   * @param {*} ivStr
   */
  encrypt (word, keyStr, ivStr) {
    let key = KEY;
    let iv = IV;
    if (keyStr) {
      key = CryptoJS.enc.Utf8.parse(keyStr);
      iv = CryptoJS.enc.Utf8.parse(ivStr);
    }
    let srcs = CryptoJS.enc.Utf8.parse(word);
    var encrypted = CryptoJS.AES.encrypt(srcs, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.ZeroPadding
    });
    return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
  },

  /**
   * 解密
   * @param {*} word
   * @param {*} keyStr
   * @param {*} ivStr
   */
  decrypt (word, keyStr, ivStr) {
    let key = KEY;
    let iv = IV;
    if (keyStr) {
      key = CryptoJS.enc.Utf8.parse(keyStr);
      iv = CryptoJS.enc.Utf8.parse(ivStr);
    }
    let base64 = CryptoJS.enc.Base64.parse(word);
    let src = CryptoJS.enc.Base64.stringify(base64);
    let decrypt = CryptoJS.AES.decrypt(src, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.ZeroPadding
    });
    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
    return decryptedStr.toString();
  }
}

如何使用:

// 加密
handleEncrypt(){
  this.encryptStr = crypto.encrypt(this.str);
},
// 解密
handleDecrypt(){
  this.decryptStr = crypto.decrypt(this.encryptStr);
  console.log(this.decryptStr);
}

打完收工!

posted @ 2022-08-31 14:48  帅到要去报警  阅读(2181)  评论(0)    收藏  举报