最近为了解决项目中用户名、密码明文传输的问题,使用了AES在前台加密,然后在后台解密,稍微整理了一下,记录AES前台加解密和后台java加解密,以防忘记。
前台使用CryptoJS实现AES加解密的,所以要先下载组件,下载CryptoJS-v3.1.2版本之后,文件中包含components和rollups两个文件夹,components文件夹下是单个组件,rollups文件夹下是汇总,引用rollups下的aes.js文件即可。
下载地址:CryptoJS-v3.1.2
上面的下载资源是CSDN网站下载,需要积分。这里我上传到百度云,可以在百度云下载。
链接:https://pan.baidu.com/s/11xle84xGqQRGkcp1ckCNqQ
提取码:74vr
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
AES加解密
加密后的数据:
解密后的数据:
package com.yanzhengma.servlet;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class AESTest {
public static void main(String args[]) throws Exception{
String content = "test";
String key = "abcdefghijklmn12";
String iv = "abcdefghijklmn12";
//加密
byte[] encrypted = AES_CBC_Encrypt(content.getBytes(), key.getBytes(), iv.getBytes());
//解密
byte[] decrypted = AES_CBC_Decrypt(decryptBASE64("加密后的密文"), key.getBytes(), iv.getBytes());
System.out.println("加密后:"+encryptBASE64(encrypted));
System.out.println("解密后:"+byteToString(decrypted));
}
public static String byteToString(byte[] byte1){
return new String(byte1);
}
public static byte[] AES_CBC_Encrypt(byte[] content, byte[] keyBytes, byte[] iv){
try {
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,key, new IvParameterSpec(iv));
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
System.out.println("exception:"+e.toString());
}
return null;
}
public static byte[] AES_CBC_Decrypt(byte[] content, byte[] keyBytes, byte[] iv){
try {
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE,key, new IvParameterSpec(iv));
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
System.out.println("exception:"+e.toString());
}
return null;
}
//字符串装换成base64
public static byte[] decryptBASE64(String key) throws Exception {
return Base64.decodeBase64(key.getBytes());
}
//base64装换成字符串
public static String encryptBASE64(byte[] key) throws Exception {
return new String(Base64.encodeBase64(key));
}
}
原文链接:https://blog.csdn.net/armys/article/details/79213631
首先需要说明一下,以上的前端代码加密解密程序都是没有问题的。包括前端加密后,后台命令行运行解密都是可以正常运行的。(包括中文问题,都不会出现乱码问题的。)
但是:如果在你的控制器端,前端对中文内容进行加密的时候,控制器进行解密是会出现乱码问题。
问题描述:
aes在解密后,用byte[]进行接收,需要使用new String();进行转换为字符。只需要指定new String()编码格式便可以解决解密时乱码问题。
接下来我们看下2块解密时部分代码:
1.将aes得到结果转变为字符,不设置编码格式
new String(aesDecrypt(Base64.decode(ciphertext),Base64.decode(key)))
2.将aes得到结果转变为字符,设置编码格式
new String(aesDecrypt(Base64.decode(ciphertext),Base64.decode(key)),"UTF-8");
所以根据上面的描述:我们将第2步中的解密方法修改一下即可
public static String byteToString(byte[] byte1){
//return new String(byte1);
return new String(byte1, "UTF-8"); //使用utf-8编码,防止中文乱码
}
到此,项目中的中文乱码问题解决。
原文链接:https://blog.csdn.net/u012012240/article/details/54090958
其他资料: