后端:
首先导入aes依赖
<!-- aes加密工具 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
编写aes工具类
@Slf4j
public class AesUntil {
/**
* 偏移量,AES 128位数据块对应偏移量为16位
* AES 128位数据块对应偏移量为16位
*/
private static final String VIPARA = "2607789674lvshih";
/**
* 密匙,必须16位
*/
private static final String KEY = "h4k4f557f8gt5r27";
/**
* 编码
*/
private static final String ENCODING = "UTF-8";
/**
* 算法
*/
private static final String ALGORITHM = "AES";
/**
* AES:加密方式 CBC:工作模式 PKCS5Padding:填充模式
*/
private static final String CBC_PKCS5_PADDING = "AES/CBC/PKCS5Padding";
/**
* AES加密
* @param data
* @return String
*/
public static String AESencrypt(String data)
{
if(data==null|| StringUtils.isEmpty(data)){
return data;
}
/*
* 新建一个密码编译器的实例,由三部分构成,用"/"分隔,分别代表如下
* 1. 加密的类型(如AES,DES,RC2等)
* 2. 模式(AES中包含ECB,CBC,CFB,CTR,CTS等)
* 3. 补码方式(包含nopadding/PKCS5Padding等等)
* 依据这三个参数可以创建很多种加密方式
*/
try {
Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
//偏移量
IvParameterSpec ivParameterSpec = new IvParameterSpec(VIPARA.getBytes(ENCODING));
//加密秘钥
SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(ENCODING), ALGORITHM);
//初始化密码编译器
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParameterSpec);
//生成加密后的密文
byte[] bytes = cipher.doFinal(data.getBytes(ENCODING));
//将密文Base64转码返回
return Base64.encodeBase64String(bytes);
}catch (Exception e){
log.error("参数加密失败--{}",e);
return null;
}
}
public static String AESdecrypt(String data){
if(data==null|| StringUtils.isEmpty(data)){
return data;
}
try {
Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
//偏移量
IvParameterSpec ivParameterSpec = new IvParameterSpec(VIPARA.getBytes(ENCODING));
//加密秘钥
SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(ENCODING), ALGORITHM);
//初始化密码编译器
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParameterSpec);
byte[] bytes = cipher.doFinal(Base64.decodeBase64(data));
return new String(bytes,ENCODING);
}catch (Exception e){
log.error("参数解密失败--{}",e);
return data;
}
}
}
在需要使用的地方最直接调用即可。
前端
引入 crypto-js
npm install -S crypto-js
新建全局工具类
import CryptoJS from 'crypto-js'
const finalKey = CryptoJS.enc.Utf8.parse('h4k4f557f8gt5r27')
const finalIv = CryptoJS.enc.Utf8.parse('2607789674lvshih')
export function encrypt(data) {
let key=finalKey
let iv=finalIv
let srcs=CryptoJS.enc.Utf8.parse(data);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
}
前后端秘钥和key和加密方式,填充方式要一致。不然无法校验。