前后端数据AES加密传输


AES 中文译为高级加密标准,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的 DES(Data Encryption Standard) ,已经被多方分析且广为全世界所使用。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

下面具体介绍一下如何在前后端分离工程中利用AES实现数据加密。

一、前端配置

1. AES配置

(1) 模块安装

在使用 AES 之前需要安装相应的模块依赖。

npm install crypto-js
(2) 工具类

新建 AES.js 工具文件,需要注意一点的是这里的 keyStrivStr 长度必须为 16 位。

import CryptoJS from 'crypto-js/crypto-js'

// 默认的 KEY 与 iv, 16 位字符串即可
const keyStr = '1234567890123456'
const ivStr = '1234567890123456'

    // 加密
export function Encrypt(data) {
    const key = CryptoJS.enc.Utf8.parse(keyStr)
    const srcs = CryptoJS.enc.Utf8.parse(data)
    const encrypted = CryptoJS.AES.encrypt(srcs, key, {
        iv: CryptoJS.enc.Utf8.parse(ivStr),
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.ZeroPadding
    })
    return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
}

// 解密
export function Decrypt(data) {
    const key = CryptoJS.enc.Utf8.parse(keyStr)
    const base64 = CryptoJS.enc.Base64.parse(wdataord)
    const src = CryptoJS.enc.Base64.stringify(base64)
    const decrypt = CryptoJS.AES.decrypt(src, key, {
        iv: CryptoJS.enc.Utf8.parse(ivStr),
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.ZeroPadding
    })
    const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
    return decryptedStr.toString()
}

2. AES引用

AES 引用就比较简单了,导入方法后直接调用即可。

// 引入模块
import {Encrypt,Decrypt} from '@/utils/AES.js';

export default {
data() {
    return {
        password: ''
    }
},
methods: {
    OK() {
        const params = Encrypt(this.password)
        // 打印加密后内容
        console.log(params)
    }
}

二、后端配置

1. 依赖导入

Maven 工程配置文件中导入如下依赖。

<dependency>
    <groupId>org.apache.directory.studio</groupId>
    <artifactId>org.apache.commons.codec</artifactId>
    <version>1.8</version>
</dependency>

2. 工具类

新建 AesUtil.java 工具类,具体代码如下:

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AesEncryptUtil {

    /**
     * 加密
     */
    public static String encrypt(String data, String key, String iv) throws Exception {
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"NoPadding PkcsPadding
            int blockSize = cipher.getBlockSize();
            byte[] dataBytes = data.getBytes();
            int plaintextLength = dataBytes.length;
            if (plaintextLength % blockSize != 0) {
                plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
                }
            byte[] plaintext = new byte[plaintextLength];
            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
            byte[] encrypted = cipher.doFinal(plaintext);
            return new Base64().encodeToString(encrypted);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 解密
     */
    public static String desEncrypt(String data, String key, String iv) throws Exception {
        try {
            byte[] encrypted1 = new Base64().decode(data);
            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original);
            return originalString;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3. 使用示例

完成上述的工具类封装之后就可以直接使用了,下面是一个简单的使用示例。

// 默认的 KEY 与 IV ,统一的 16 位字符串即可
private static String KEY = "abcdefghjklmnopq";
private static String IV = "abcdefghjklmnopq";

@Test
public void Encrypt() {
    String data = "Hello World!";

    try {
        String enStr = encrypt(str, KEY, IV);
        System.out.println("加密:" + enStr);

        String deStr = desEncrypt(enStr, KEY, IV).trim();
        System.out.println("解密:" + deStr);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

参考链接:

  1. vue实现AES加密

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录