程序员开发实例大全宝库

网站首页 > 编程文章 正文

实现前端传递参数进行加密,Java后端接收数据解密

zazugpt 2025-05-09 22:46:11 编程文章 2 ℃ 0 评论

下面为你介绍前端传递参数加密、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)
  1. 密钥一致性:前端和后端使用的密钥必须一致,否则无法正确解密。
  2. 填充模式:前端和后端使用的填充模式(如 PKCS5Padding)必须一致。
  3. 编码问题:前端加密后的结果通常是 Base64 编码的字符串,后端在解密前需要先进行 Base64 解码。
  4. 安全性:AES 是对称加密算法,密钥的安全传输和存储非常重要。在实际应用中,建议使用 HTTPS 来保证密钥和数据的安全传输。

以上代码展示了前端使用 JavaScript 和 CryptoJS 库进行加密,Java 后端使用 javax.crypto 包进行解密的基本实现方法。你可以根据实际需求进行调整和扩展。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表