Vue中的前端crypto.js加解密

  • Post category:http

下面我会详细讲解Vue中的前端crypto.js加解密的完整攻略。

简介

crypto.js是一个JavaScript库,提供了各种加密算法,如AES、MD5等。在Vue项目中,可以使用crypto.js实现前端加解密操作,确保敏感数据在网络传输时的安全性。

下载和安装

下载crypto.js需要借助npm包管理器,可以通过以下命令进行安装:

npm install crypto-js

使用方法

在Vue项目中使用的时候,首先需要在组件中引入crypto.js:

import CryptoJS from 'crypto-js';

对称加密

对称加密是一种加密方式,使用相同的加密和解密密钥,加密数据和解密数据都使用同一个密钥。crypto.js提供了多种对称加密算法,这里以AES为例。

AES加密

下面是一个对一段文本进行AES加密的示例:

const plaintext = 'Hello, world!'; // 原文
const key = '1234567890abcdef'; // 密钥
// 加密
const ciphertext = CryptoJS.AES.encrypt(plaintext, key).toString();
console.log(ciphertext); // 输出加密后的字符串

AES解密

使用相应的密钥对密文进行解密:

const ciphertext = 'U2FsdGVkX18TNFlnM13MhqGjmXFMzOgZHYIgNEdPkBw='; // 密文
const key = '1234567890abcdef'; // 密钥
// 解密
const bytes = CryptoJS.AES.decrypt(ciphertext, key);
const plaintext = bytes.toString(CryptoJS.enc.Utf8);
console.log(plaintext); // 输出解密后的字符串

非对称加密

非对称加密是一种加密方式,使用一般的加密和解密密钥,加密数据和解密数据不使用同一个密钥。常见的非对称加密算法有RSA和ECC。

这里以RSA为例,讲解RSA的加解密过程。

RSA生成密钥对

在使用RSA加解密的时候,首先需要生成密钥对:

const key = CryptoJS.lib.WordArray.random(128 / 8); // 生成128位随机密钥
const keyPair = CryptoJS.RSA.generateKeyPair(1024, 65537); // 生成1024位RSA密钥对
const privateKey = keyPair.privateKey; // 获取私钥
const publicKey = keyPair.publicKey; // 获取公钥

RSA加密

使用公钥对数据进行加密:

const plaintext = 'Hello, world!'; // 原文
const ciphertext = CryptoJS.RSA.encrypt(plaintext, publicKey).toString(); // 加密
console.log(ciphertext); // 输出加密后的字符串

RSA解密

使用私钥对密文进行解密:

const ciphertext = 'KqOo2lSJ2IOLI86YzvvWooPccErWJ/5Y3mt0kzsbW/RX0lQ9QHwkpwp+9FXZfx8eryJtJNnOWkzf2zQAsNacdw=='; // 密文
const plaintext = CryptoJS.RSA.decrypt(ciphertext, privateKey).toString(CryptoJS.enc.Utf8); // 解密
console.log(plaintext); // 输出解密后的字符串

示例说明

下面是一个组件中使用AES加解密的示例:

<template>
  <div>
    <p>原文:<input v-model="plaintext"/></p>
    <p>密钥:<input v-model="key"/></p>
    <p>加密结果:<span>{{ciphertext}}</span></p>
    <p>解密结果:<span>{{decodedText}}</span></p>
  </div>
</template>

<script>
import CryptoJS from 'crypto-js';

export default {
  data() {
    return {
      plaintext: '',
      key: '',
      ciphertext: '',
      decodedText: ''
    };
  },

  methods: {
    encrypt() {
      this.ciphertext = CryptoJS.AES.encrypt(this.plaintext, this.key).toString();
    },

    decrypt() {
      const bytes = CryptoJS.AES.decrypt(this.ciphertext, this.key);
      this.decodedText = bytes.toString(CryptoJS.enc.Utf8);
    }
  }
}
</script>

这个组件中有两个输入框,分别用来输入原文和密钥。在页面中显示加密结果和解密结果。当用户输入完成后,点击加密按钮,组件会使用输入的原文和密钥进行AES加密。点击解密按钮后,组件会使用输入的密文和密钥进行AES解密,并显示解密结果。

下面是一个组件中使用RSA加解密的示例:

<template>
  <div>
    <p>原文:<input v-model="plaintext"/></p>
    <p>加密/解密密钥:<input v-model="key"/></p>
    <p>加密结果:<span>{{ciphertext}}</span></p>
    <p>解密结果:<span>{{decodedText}}</span></p>
  </div>
</template>

<script>
import CryptoJS from 'crypto-js';

export default {
  data() {
    return {
      plaintext: '',
      key: '',
      ciphertext: '',
      decodedText: '',
      privateKey: null,
      publicKey: null
    };
  },

  methods: {
    generateKeyPair() {
      this.privateKey = CryptoJS.RSA.generateKeyPair(1024, 65537).privateKey;
      this.publicKey = CryptoJS.RSA.generateKeyPair(1024, 65537).publicKey;
    },

    encrypt() {
      this.ciphertext = CryptoJS.RSA.encrypt(this.plaintext, this.publicKey).toString();
    },

    decrypt() {
      this.decodedText = CryptoJS.RSA.decrypt(this.ciphertext, this.privateKey).toString(CryptoJS.enc.Utf8);
    }
  }
}
</script>

这个组件中有两个输入框,分别用来输入原文和加密/解密密钥。在页面中显示加密结果和解密结果。当用户点击生成密钥对按钮后,组件会自动生成RSA密钥对。点击加密按钮,组件会使用输入的原文和公钥进行RSA加密。点击解密按钮后,组件会使用输入的密文和私钥进行RSA解密,并显示解密结果。