关于 AES 的前后端加解密的处理
后端代码:
jar包支持:jce.jar
工具类:CipherUtil
package com.winlife.utils.cipher;
import com.winlife.utils.exception.SystemRuntimeException;
import org.apache.commons.codec.binary.Base64;
import org.springframework.util.StringUtils;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
/**
* @描述 AES 加解密算法
* @创建人 cyw
* @创建时间 2021/9/28 9:44
*/
public class CipherUtil {
public static final String CHARSET_UTF8 = "UTF-8";
/**
* 数据传输加密KEY
*/
private static final String TT_CIPHER_KEY = "081FBFB4AFA081C7";
/**
* 数据传输加密向量
*/
private static final String TT_CIPHER_IV = "AFA081C7081FBFB4";
/**
* 密码传输加密KEY
*/
private static final String PW_CIPHER_KEY = "F35267BD3D02B727";
/**
* 数据传输加密向量
*/
private static final String PW_CIPHER_IV = "3A46AAB1CC6047F4";
/**
* 加密算法
*/
private static final String CIPHER_ALGORITHM = "AES";
/**
* 加密变换
*/
private static final String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding";
public static void main(String[] arg){
System.out.println("加密:");
System.out.println("加密:"+pwEncrypt("111111"));
System.out.println("解密:"+pwDcrypt(pwEncrypt("111111")));
}
/**
* base64 code、AES 密码加密
* @author cyw
* @param content 需要加密的内容
* @return 加密后String
* @throws Exception
*/
public static String pwEncrypt(String content) {
if(StringUtils.isEmpty(content)){
return null;
}
try {
return base64Encode(AESEncrypt(content, PW_CIPHER_KEY, PW_CIPHER_IV));
} catch (Exception e) {
e.printStackTrace();
throw new SystemRuntimeException("数据加密失败", e);
}
}
/**
* 此项目使用的解密方法
* base64 、AES 密码解密
* @author cyw
* @param content 带解密内容
* @return 解密结果
* @throws Exception
*/
public static String pwDcrypt(String content){
if(StringUtils.isEmpty(content)){
return null;
}
try {
return AESDecrypt(base64Decode(content), PW_CIPHER_KEY, PW_CIPHER_IV);
} catch (Exception e) {
e.printStackTrace();
throw new SystemRuntimeException("数据解密失败", e);
}
}
/**
* base64 code、AES 数据传输加密
* @author cyw
* @param content 需要加密的内容
* @return 加密后String
* @throws Exception
*/
public static String transEncrypt(String content) {
if(StringUtils.isEmpty(content)){
return null;
}
try {
return base64Encode(AESEncrypt(content, TT_CIPHER_KEY, TT_CIPHER_IV));
} catch (Exception e) {
e.printStackTrace();
throw new SystemRuntimeException("数据加密失败", e);
}
}
/**
* base64 、AES 数据传输解密
* @author cyw
* @param content 带解密内容
* @return 解密结果
* @throws Exception
*/
public static String transDcrypt(String content){
if(StringUtils.isEmpty(content)){
return null;
}
try {
return AESDecrypt(base64Decode(content), TT_CIPHER_KEY, TT_CIPHER_IV);
} catch (Exception e) {
e.printStackTrace();
throw new SystemRuntimeException("数据解密失败", e);
}
}
/**
* AES加密
* @author cyw
* @param content 需要加密的内容
* @param encryptKey 加密密钥
* @param iv 加密向量
* @return 加密后的byte[](AES加密)
* @throws Exception
*/
private static byte[] AESEncrypt(String content, String encryptKey, String iv) throws Exception{
SecretKeySpec keySpec = new SecretKeySpec(encryptKey.getBytes(), CIPHER_ALGORITHM);
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
// 加密
Cipher cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);// 创建密码器
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);// 初始化
return cipher.doFinal(content.getBytes(CHARSET_UTF8)); // 加密
}
/**
* AES解密
* @author cyw
* @param encryptBytes 待解密byte[]
* @param decrytKey 解密密钥
* @param iv 解密向量
* @return 解密结果
*/
private static String AESDecrypt(byte[] encryptBytes, String decrytKey, String iv) throws Exception{
SecretKeySpec keySpec = new SecretKeySpec(decrytKey.getBytes(), CIPHER_ALGORITHM);
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance(CIPHER_TRANSFORMATION); // 创建密码器
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); // 初始化
return new String(cipher.doFinal(encryptBytes),"UTF-8"); // 解密 upd xin 添加编码格式防止乱码
}
/**
* base64 解码
* @author cyw
* @param base64Code 待解码的数据
* @return 解码后的byte[]
* @throws IOException
*/
private static byte[] base64Decode(String base64Code) throws IOException {
if (base64Code == null || "".equals(base64Code)) {
return null;
}
return Base64.decodeBase64(new String(base64Code.getBytes("UTF-8")).getBytes("UTF-8")); //upd xin 添加编码格式防止乱码
}
/**
* base64加密
* @param bytes 待编码的byte[]
* @return 编码后的base64 code
*/
private static String base64Encode(byte[] bytes) {
if (bytes == null || bytes.length == 0) {
return null;
}
return Base64.encodeBase64String(bytes);
}
}
前端代码:vue
先下载组件:npm install crypto-js
const CryptoJS = require('crypto-js'); //引用AES源码js
const key = CryptoJS.enc.Utf8.parse("F35267BD3D02B727"); //十六位十六进制数作为秘钥
const iv = CryptoJS.enc.Utf8.parse('3A46AAB1CC6047F4'); //十六位十六进制数作为秘钥偏移量
//解密方法
function Decrypt(word) {
var encryptedHexStr = CryptoJS.enc.Hex.parse(word);
var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
let decrypt = CryptoJS.AES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
debugger
return decryptedStr.toString()
}
//加密方法
function Encrypt(word) {
let encrypted = CryptoJS.AES.encrypt(word, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
return encrypted.toString();
}
export default {
Decrypt,
Encrypt
}
借此,实现前后端的密码(敏感字符)的加解密操作

浙公网安备 33010602011771号