在现代Web,App应用中,数据安全是一个不可忽视的话题。在前端和后端之间传输敏感数据时,加密技术能够有效保护这些数据不被未经授权的访问。本文将介绍如何在前端使用 CryptoJS 库进行加密,并在后端使用 Springboot进行解密,实现数据的安全传输。

1. 前端CryptoJS 介绍

CryptoJS是一个广泛使用的JavaScript加密库,支持多种加密算法,如AES、DES和SHA等。它使得在浏览器端对信息进行加密变得简单,从而有效保护用户的隐私安全。

2. Java 加解密介绍

在Springboot,我们同样可以使用内置的加密库来进行数据的加密和解密。Java 提供了 各种包,可以处理多种加密算法。

3.前端加密示例(基于Vue Uniapp)

  在前端使用 CryptoJS 对数据进行加密。以下代码段展示了如何使用 AES 算法加密字符串:

#安装模块,不要引入最新包,

 npm install crypto-js@3.3.0

注意:不要引入最新包,容易出现问题,引入3.3.0即可

Error: Native crypto module could not be used to get secure random number

#引入模块

import CryptoJS from 'crypto-js'

const key = 'ASDF1234=2=f!yV5Z'; // 密钥,自行修改

 export function aesEncrypt(plaintext) {
        try {
            const ciphertext = 'qZief4Y7nr5O2yK5cQxf9z1C5S7g16AP9fNHrHCeNBM='; // 解密字符串
            const keyBytes = CryptoJS.enc.Utf8.parse(key);
            const encrypted = CryptoJS.AES.encrypt(
                CryptoJS.enc.Utf8.parse(plaintext), keyBytes, {
                    mode: CryptoJS.mode.ECB,  //aes加密模式EcB 前后端使用统一的加密模式
                    padding: CryptoJS.pad.Pkcs7  //使用Pkcs7的方式填充
                }
            );
            const hexStr = CryptoJS.enc.Hex.parse(encrypted.ciphertext.toString());
            return CryptoJS.enc.Base64.stringify(hexStr);
        } catch (e) {
            // console.log("===aesEncrypt ", e);
        }
        return plaintext;
    }
    
 export function aesDecrypt(secrecyStr) {
            try {
                const keyBytes = CryptoJS.enc.Utf8.parse(key);
                const decryptedBytes = CryptoJS.AES.decrypt(secrecyStr, keyBytes, {
                    mode: CryptoJS.mode.ECB,// 前后端一致的加解密模式
                    padding: CryptoJS.pad.Pkcs7// 前后端一致的填充方式
                });
                const decryptedText = decryptedBytes.toString(CryptoJS.enc.Utf8);
                return decryptedText;
            } catch (e) {
                return secrecyStr;
            }
}

// 示例
const testData = 'Hello, World!';
const encryptedData = aesEncrypt(testData);
console.log('Encrypted Data:', encryptedData);

const decryptedData = aesDecrypt(encryptedData);
console.log('Decrypted Data:', decryptedData);

4.后端加密示例(基于若依springboot)

package tech.jhbc.utils;

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

import java.nio.charset.StandardCharsets;
import java.security.DigestException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Base64;
/**
 *
 * 兼容node
 *
 */
public class CryptoUtil {
    private static final String ALGORITHM = "AES/ECB/PKCS5Padding";
    //密钥
    private static final String key = "SDF1234=2=f!yV5Z";

    public static void main(String[] args) throws Exception {
        String aaa = "测试代码";
        System.out.printf("====== 加密 === 明文 [%s] 密文 [%s] \n", aaa, encrypt(aaa));
        String bbb = "aRCbHShtrpNWJnNg25W69g==";
        System.out.printf("====== 解密 === 密文 [%s] 明文 [%s] \n", bbb, decrypt(bbb));
    }

    public static String encrypt(String data)  {
        try{
            Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, aesKey);
            byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
            return Base64.getEncoder().encodeToString(encrypted);
        } catch (Exception e) {
        return null;
    }
    }
    public static String decrypt(String encryptedData) {

        try {
            Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, aesKey);
            byte[] decoded = Base64.getDecoder().decode(encryptedData);
            return new String(cipher.doFinal(decoded), StandardCharsets.UTF_8);
        } catch (Exception e) {
            return null;
        }
    }
}

maven 依赖包

1.在主模块pom.xml上添加
 
 
<bcprov-jdk15on.version>1.60</bcprov-jdk15on.version>
 
 
<!--前端密码解密-->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>${bcprov-jdk15on.version}</version>
</dependency>
 
 
2.在子模块pom.xml上
 
 
<!--前端密码解密-->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
</dependency>