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数据更新UI不刷新显示的解决办法

    我来为您讲解“Vue数据更新UI不刷新显示的解决办法”的完整攻略。 问题描述 当我们使用Vue框架开发网页时,有时候会发现数据已经修改,但是UI界面并没有更新,这时候我们就需要寻找解决这个问题的办法。 原因分析 Vue框架的数据响应式更新是通过数据劫持和发布-订阅模式实现的,当数据发生改变时,Vue会自动触发更新UI的操作。但是,在一些情况下,Vue可能无法…

    Vue 2023年5月29日
    00
  • 在vue项目中promise解决回调地狱和并发请求的问题

    在 Vue 项目中,我们通常会使用 axios 或其他第三方库来进行数据请求。但是在多个请求中,我们通常会遇到回调地狱和并发请求的问题,这就需要使用 Promise 来解决。 一、使用 Promise 处理回调地狱 1.1 什么是回调地狱? 回调地狱指的是在一个回调函数中再添加一个回调函数,再添加一个回调函数,造成代码的嵌套过深,使得代码变得复杂难以维护。例…

    Vue 2023年5月28日
    00
  • Vue结合Element-Plus封装递归组件实现目录示例

    首先我们来简单介绍一下Vue.js和Element-Plus: Vue.js是一款轻量级的全功能JavaScript框架,主要用于构建用户界面和单页应用(SPA)。它具有响应式和组件化的思想,能够更好地实现可重用性、灵活性和可维护性。 Element-Plus是基于Vue.js的一款UI组件库,它提供了一系列基础组件和高级组件,能够快速地构建出高质量的用户界…

    Vue 2023年5月27日
    00
  • vue 中使用print.js导出pdf操作

    下面是详细讲解 “Vue 中使用 print.js 导出 PDF 操作” 的完整攻略: 一、什么是 Print.js Print.js 是一个简单的打印插件,可以让你轻松地打印任何元素。不需要额外的 CSS,只需要调用它的 JavaScript 函数即可。此外,它还支持导出为 PDF 格式。 二、安装 Print.js 你可以使用 npm 或直接在 HTML…

    Vue 2023年5月27日
    00
  • Vue 图片压缩并上传至服务器功能

    下面是 Vue 图片压缩并上传至服务器的完整攻略。 1. 安装必要的库和工具 在使用 Vue 图片压缩并上传至服务器功能之前,需要确保已经安装以下必要的库和工具: vue: Vue.js 框架 axios: HTTP 请求库 compressorjs: 图片压缩库,用来将图片压缩至指定的大小 qs: Querystring 库,用来序列化表单数据 multe…

    Vue 2023年5月27日
    00
  • vue中created、watch和computed的执行顺序详解

    请看下面的攻略。 Vue中created、watch和computed的执行顺序详解 在Vue中,我们可以使用created、watch和computed来响应数据的变化,但是它们的执行顺序可能会导致一些意想不到的问题。下面我将详细讲解它们的执行顺序。 1. created的执行顺序 当一个Vue实例被创建时,created钩子函数会立即被调用。在creat…

    Vue 2023年5月29日
    00
  • vue实现一个单文件组件的完整过程记录

    下面是“vue实现一个单文件组件的完整过程记录”的攻略: 什么是单文件组件? 单文件组件是Vue.js的一个重要概念。所谓单文件组件,就是一个Vue组件被封装在一个独立的文件中,包括组件所需的模板、CSS样式和JavaScript代码。单文件组件的扩展名通常为.vue,这个文件可以被其他Vue组件或Vue实例引用和渲染,从而将组件保持独立和可复用。 基本结构…

    Vue 2023年5月28日
    00
  • vue项目中存储与使用后端传递过来的token

    在Vue项目中使用后端传递过来的token需要进行以下几个步骤: 1. 发送登录请求,获取token 在登录页面,用户输入用户名和密码后,向后端发送登录请求。如果用户名和密码验证成功,后端返回一个token给前端。 axios.post(‘/login’, { username: ‘username’, password: ‘password’ }) .th…

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