CryptoJS中AES实现前后端通用加解密技术

CryptoJS是一个流行的JavaScript加密库,提供了诸如AES、SHA-1、SHA-256等常用的加密算法。在前后端通信过程中,为了增加数据的安全性,我们常常需要对数据进行加密。本文将详细介绍如何使用CryptoJS中AES实现前后端通用加解密技术。

1. CryptoJS简介

CryptoJS是一种纯JavaScript库,可用于各种加密算法和解密算法,也可用于哈希函数。它支持两种加密模式:流加密模式和块加密模式。加密算法包括AES、DES、TripleDES、RC4等。

2. 前端加密实现

首先,我们需要引入CryptoJS的核心库和AES模块,如下所示:

<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/enc-base64.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/aes.min.js"></script>

接下来,我们可以使用如下的AES加密和解密函数:

// AES加密
function aesEncrypt(data, secretKey) {
    let key = CryptoJS.enc.Utf8.parse(secretKey);
    let iv = CryptoJS.enc.Utf8.parse(secretKey);
    let encrypted = CryptoJS.AES.encrypt(data, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString();
}

// AES解密
function aesDecrypt(data, secretKey) {
    let key = CryptoJS.enc.Utf8.parse(secretKey);
    let iv = CryptoJS.enc.Utf8.parse(secretKey);
    let decrypted = CryptoJS.AES.decrypt(data, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return decrypted.toString(CryptoJS.enc.Utf8);
}

其中,data为要加密或解密的数据,secretKey为密钥。

3. 后端加密实现

在后端的加密过程中,我们可以使用Java的CryptoJS库。首先,我们需要将前端的AES加密函数所使用的密钥转换为Java中的密钥格式,示例如下:

// 将前端密钥进行转换
private static SecretKeySpec getKey(String key) throws Exception {
    byte[] rawKey = key.getBytes(StandardCharsets.UTF_8);
    byte[] keyBytes = new byte[16];
    int len = rawKey.length;
    if (len > keyBytes.length) {
        len = keyBytes.length;
    }
    System.arraycopy(rawKey, 0, keyBytes, 0, len);
    return new SecretKeySpec(keyBytes, "AES");
}

然后,我们可以使用如下的Java函数进行AES加密和解密:

// AES加密
public static String aesEncrypt(String data, String secretKey) throws Exception {
    SecretKeySpec key = getKey(secretKey);
    byte[] iv = secretKey.getBytes(StandardCharsets.UTF_8);
    IvParameterSpec ivSpec = new IvParameterSpec(iv);
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
    byte[] encrypted = cipher.doFinal(data.getBytes());
    return Base64.getEncoder().encodeToString(encrypted);
}

// AES解密
public static String aesDecrypt(String data, String secretKey) throws Exception {
    SecretKeySpec key = getKey(secretKey);
    byte[] iv = secretKey.getBytes(StandardCharsets.UTF_8);
    IvParameterSpec ivSpec = new IvParameterSpec(iv);
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
    byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(data));
    return new String(decrypted, StandardCharsets.UTF_8);
}

其中,data为要加密或解密的数据,secretKey为密钥。

4. 示例说明

下面,我们分别以前端React框架和后端Spring Boot框架为例,演示如何使用CryptoJS中AES实现前后端通用加解密技术。

前端示例

import CryptoJS from 'crypto-js';

const secretKey = '123456';

// 加密数据
const data = 'hello world';
const encryptedData = aesEncrypt(data, secretKey);
console.log('encryptedData:', encryptedData);

// 解密数据
const decryptedData = aesDecrypt(encryptedData, secretKey);
console.log('decryptedData:', decryptedData);

后端示例

import java.nio.charset.StandardCharsets;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class CryptoUtil {

    private static SecretKeySpec getKey(String key) throws Exception {
        byte[] rawKey = key.getBytes(StandardCharsets.UTF_8);
        byte[] keyBytes = new byte[16];
        int len = rawKey.length;
        if (len > keyBytes.length) {
            len = keyBytes.length;
        }
        System.arraycopy(rawKey, 0, keyBytes, 0, len);
        return new SecretKeySpec(keyBytes, "AES");
    }

    public static String aesEncrypt(String data, String secretKey) throws Exception {
        SecretKeySpec key = getKey(secretKey);
        byte[] iv = secretKey.getBytes(StandardCharsets.UTF_8);
        IvParameterSpec ivSpec = new IvParameterSpec(iv);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
        byte[] encrypted = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encrypted);
    }

    public static String aesDecrypt(String data, String secretKey) throws Exception {
        SecretKeySpec key = getKey(secretKey);
        byte[] iv = secretKey.getBytes(StandardCharsets.UTF_8);
        IvParameterSpec ivSpec = new IvParameterSpec(iv);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
        byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(data));
        return new String(decrypted, StandardCharsets.UTF_8);
    }

    public static void main(String[] args) throws Exception {
        String secretKey = "123456";

        // 加密数据
        String data = "hello world";
        String encryptedData = aesEncrypt(data, secretKey);
        System.out.println("encryptedData:" + encryptedData);

        // 解密数据
        String decryptedData = aesDecrypt(encryptedData, secretKey);
        System.out.println("decryptedData:" + decryptedData);
    }
}

在以上两个示例中,我们都使用了123456作为密钥对hello world进行加解密,并输出了加密和解密的结果。

总结

本文介绍了CryptoJS中AES实现前后端通用加解密技术的完整攻略,包括前端和后端的加密实现方法以及示例说明。通过本文的学习,我们可以更好地保障数据的安全性,在前后端通信过程中更加安全可靠地传输数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:CryptoJS中AES实现前后端通用加解密技术 - Python技术站

(1)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • Vue 3需要避免的错误

    下面是关于“Vue 3需要避免的错误”的攻略: 1. 删除节点 在Vue 3中,删除节点需要使用remove(),而不是之前版本中常用的$destroy()。 <template> <div v-if="show"> Some content to be removed </div> <butto…

    Vue 2023年5月28日
    00
  • springboot vue测试平台接口定义前后端新增功能实现

    下面我将详细讲解“springboot vue测试平台接口定义前后端新增功能实现”的完整攻略,这包括如何进行前后端的接口定义以及新增功能的开发实现。具体攻略如下: 1. 环境准备 在开始之前,需要确保本机已经安装了以下环境: JDK 8或以上版本 Node.js 8或以上版本 Vue CLI IntelliJ IDEA 或其他java开发工具 VS Code…

    Vue 2023年5月28日
    00
  • Vue响应式原理深入分析

    Vue响应式原理深入分析 Vue.js是一个流行的JavaScript框架,它的核心包括Vue.js库和Vue.js运行时,能够让我们构建用户交互的Web应用程序。Vue.js的根本原理就是响应式,下面将详细讲解Vue响应式的原理及其实现方式。 Vue响应式的原理 Vue.js的响应式原理是基于ES5中的Object.defineProperty()方法(E…

    Vue 2023年5月27日
    00
  • 使用SpringBoot+EasyExcel+Vue实现excel表格的导入和导出详解

    使用SpringBoot+EasyExcel+Vue实现excel表格的导入和导出,主要步骤如下: 1.引入EasyExcel依赖 在pom.xml中引入EasyExcel依赖: <!– 引入EasyExcel –> <dependency> <groupId>com.alibaba</groupId> &…

    Vue 2023年5月28日
    00
  • Vue中简单的虚拟DOM是什么样

    下面我将详细讲解Vue中简单的虚拟DOM及其特点和应用。 什么是Vue中的虚拟DOM 在Vue中,将真实的DOM和虚拟的DOM都当作了节点来操作。它们的区别在于,真实的DOM节点可以直接在浏览器中渲染,而虚拟DOM节点是在内存中以对象的形式存在,有助于减少频繁的页面操作。 Vue中的虚拟DOM是一个模拟真实DOM的内存树结构,每个节点对应一个真实DOM节点,…

    Vue 2023年5月27日
    00
  • vue + webpack如何绕过QQ音乐接口对host的验证详解

    如何绕过QQ音乐接口对host的验证? 针对一些特定的服务器,如QQ音乐接口,可能对host字段的验证比较严格。此时我们需要采取一些手段来进行绕过。 本文针对vue + webpack项目,将详细讲解如何绕过QQ音乐接口对host的验证。 方案一:使用webpack-dev-server的proxyTable 我们可以在webpack配置文件中的devSer…

    Vue 2023年5月28日
    00
  • 详解vue项目打包步骤

    下面是详解Vue项目打包步骤的完整攻略: 简介 在开发 Vue.js 项目的过程中,我们需要将代码打包并将它们部署到服务器上。Vue.js 提供了一些工具来帮助我们完成打包流程,并且支持多种打包方式,包括将整个项目打包成一个文件或将项目中的组件打包成单独的文件。 打包步骤 Vue.js 项目的打包流程大致分为以下几步: 1. 安装 Vue CLI Vue C…

    Vue 2023年5月28日
    00
  • vue如何将v-for中的表格导出来

    当我们在使用Vue的v-for指令来动态渲染表格时,如何将表格导出成Excel或CSV文件呢?下面就是详细的攻略。 步骤一:安装依赖库 在Vue项目中,我们需要使用js-xlsx和file-saver这两个库来实现导出表格功能。 npm install file-saver xlsx -S 步骤二:定义数据和表头 在Vue组件中,我们需要定义要导出的数据和表…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部