网站首页 > java教程 正文
下面为你介绍前端传递参数加密、Java 后端接收数据解密的实现方法,这里以常见的 AES 对称加密算法为例。
前端加密(使用 JavaScript 和 CryptoJS 库)
CryptoJS 是一个强大的 JavaScript 加密库,可用于前端加密。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Frontend Encryption</title>
<!--引入了 CryptoJS 库-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
</head>
<body>
<input type="text" id="param" placeholder="Enter parameter">
<button onclick="encryptAndSend()">Send</button>
<script>
function encryptAndSend() {
const param = document.getElementById('param').value;
// 16字节的密钥 自己定义
const key = CryptoJS.enc.Utf8.parse('xxxyyyzgmxsxjfxy');
const encrypted = CryptoJS.AES.encrypt(param, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
const encryptedParam = encrypted.toString();
// 这里模拟发送加密后的参数到后端
console.log('Encrypted parameter:', encryptedParam);
}
</script>
</body>
</html>
在上述代码中,首先引入了 CryptoJS 库,然后定义了一个 encryptAndSend 函数,该函数会获取输入框中的参数,使用 AES 算法进行加密,并将加密后的参数打印到控制台。
后端解密(Java)
Java 提供了 javax.crypto包来实现加密和解密操作。
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AESDecryption {
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";
private static final String KEY = "xxxyyyzgmxsxjfxy"; // 16字节的密钥
public static String decrypt(String encryptedData) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), ALGORITHM);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes, StandardCharsets.UTF_8);
}
public static void main(String[] args) {
try {
String encryptedParam = "eXH1hDuwDQ+MlHme53FHEA=="; // 替换为实际的加密参数
String decryptedParam = decrypt(encryptedParam);
System.out.println("Decrypted parameter: " + decryptedParam);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上述 Java 代码中,定义了一个AESDecryption 类,其中 decrypt 方法用于解密接收到的加密参数。在 main 方法中,调用 decrypt 方法对加密参数进行解密,并将解密后的结果打印到控制台。
如果出现以下报错,请检查下面四项。
javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
at com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:975)
at com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1056)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:853)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
at javax.crypto.Cipher.doFinal(Cipher.java:2170)
- 密钥一致性:前端和后端使用的密钥必须一致,否则无法正确解密。
- 填充模式:前端和后端使用的填充模式(如 PKCS5Padding)必须一致。
- 编码问题:前端加密后的结果通常是 Base64 编码的字符串,后端在解密前需要先进行 Base64 解码。
- 安全性:AES 是对称加密算法,密钥的安全传输和存储非常重要。在实际应用中,建议使用 HTTPS 来保证密钥和数据的安全传输。
以上代码展示了前端使用 JavaScript 和 CryptoJS 库进行加密,Java 后端使用 javax.crypto 包进行解密的基本实现方法。你可以根据实际需求进行调整和扩展。
- 上一篇: Java线程池:核心参数与最佳实践
- 下一篇: 加解密的艺术
猜你喜欢
- 2025-05-24 Synchronized的实现原理详解(看这篇就够了)
- 2025-05-24 常用的加解密技术有哪些?利用Java、Python实现AES、DES、3DES
- 2025-05-24 Java设计模式:解锁实际开发中的“密码锁”
- 2025-05-24 京东大佬问我,加密后的数据如何进行模糊查询?我的回答满分
- 2025-05-24 产品经理需要了解的接口知识
- 2025-05-24 【密码学】为什么不推荐在对称加密中使用CBC工作模式
- 2025-05-24 在 Spring Boot3 开发中,是不是也为选择合适的加密算法而头疼?
- 2025-05-24 ssl 加密证书
- 2025-05-24 Nacos 中的配置文件如何实现加密传输
- 2025-05-24 加解密的艺术
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)