网站首页 > 技术文章 正文
下面为你介绍前端传递参数加密、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 包进行解密的基本实现方法。你可以根据实际需求进行调整和扩展。
猜你喜欢
- 2025-05-10 金三银四,我先去阿里了,这份阿里内部Java面试神技送你们啦
- 2025-05-10 前端卷Java:我被Shiro的setCipherKey方法坑惨了
- 2025-05-10 Java线程池面试要点(java线程池应用情景面试)
- 2025-05-10 面渣逆袭必看Java中高级面试指南,Github标星4.3k+!
- 2025-05-10 金蝶一面:Java基本数据类型有哪些?包装类型的常量池技术了解么
- 2025-05-10 冲了,最新IT大厂Java八股文面试背诵版
- 2024-09-18 前端修炼之路
- 2024-09-18 Java面试-前端基础
- 2024-09-18 学Java好还是学前端好,知了堂从两者的薪资和学习过程详细分析
- 2024-09-18 前端和Java学哪个好?哪个工资更高?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)