前端数据加密,后端java解密

在前端对数据进行加密后,通常会使用一些加密算法和技术,如AES(Advanced Encryption Standard)进行数据加密。然后,将加密后的数据发送到后端。后端接收到加密数据后,使用Java语言进行解密。

以下是一个简单的步骤和示例,演示如何在前端进行AES加密,然后在后端使用Java解密:

前端加密(使用JavaScript)

在前端,可以使用CryptoJS等库来进行AES加密:

// 引入CryptoJS库
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.js"></script>

// 加密函数
function encryptData(data, key) {
    var encrypted = CryptoJS.AES.encrypt(data, key);
    return encrypted.toString();
}

// 使用示例
var dataToEncrypt = "Sensitive data";
var encryptionKey = "yourEncryptionKey"; // 替换为你的加密密钥
var encryptedData = encryptData(dataToEncrypt, encryptionKey);

// 将encryptedData发送到后端

后端解密(使用Java)

在后端,使用Java的库如JCE(Java Cryptography Extension)来解密数据:

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESDecryptor {

    public static String decrypt(String encryptedData, String encryptionKey) throws Exception {
        byte[] decodedKey = Base64.getDecoder().decode(encryptionKey);
        SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");

        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, originalKey);

        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedData);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);

        return new String(decryptedBytes);
    }

    public static void main(String[] args) throws Exception {
        String encryptedData = "mDOkZnVKCiW0J4FZvY4uFw=="; // 替换为前端加密后的数据
        String encryptionKey = "yourEncryptionKey"; // 替换为你的加密密钥

        String decryptedData = decrypt(encryptedData, encryptionKey);
        System.out.println("Decrypted Data: " + decryptedData);
    }
}

在上述示例中:

  1. *前端使用CryptoJS的AES加密函数对数据进行加密,并将加密后的数据发送到后端。
  2. 后端Java程序中,通过解密函数 decrypt 对加密数据进行解密,使用相同的加密密钥 yourEncryptionKey。

请注意,加密算法和密钥管理是数据安全的核心部分。在实际应用中,需要注意以下几点:

  1. 加密算法选择合适的模式(如ECB、CBC等)和填充方式(如PKCS5Padding)。
  2. 密钥的安全存储和传输问题。
  3. 数据的完整性和认证问题,加密并不包含数据完整性校验和认证,可能需要使用HMAC等方式增强数据安全性。
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的前端使用 sm2 加密后端使用 java 解密的示例代码: 前端代码: ```javascript import { sm2 } from "sm-crypto"; // 待加密数据 const data = "Hello, World!"; // 公钥 const publicKey = "04a0b5376a5deca1c8dbf9c3d9f7f82d7d3a96fc79a2f54b6a4e55d90d5e9a7d2ee1d1c1b9ea37a7c3ddafef5e6d67f3dcd91f4e6c8aa1a5c5d7d4e38bda9c02e"; // 将公钥转换为 sm2 公钥对象 const publicKeyObj = sm2.SM2KeyPair(publicKey, "", { curve: "sm2p256v1", publicKeyType: "uncompressed", }); // 使用 sm2 加密数据,并将加密结果进行 base64 编码 const encryptedData = sm2.doEncrypt(data, publicKeyObj).toString("base64"); // 将加密结果发送给后端 ``` 后端代码: ```java import org.bouncycastle.crypto.params.ECPublicKeyParameters; import org.bouncycastle.crypto.params.ParametersWithRandom; import org.bouncycastle.crypto.util.PublicKeyFactory; import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey; import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.spec.ECParameterSpec; import org.bouncycastle.util.encoders.Base64; import org.bouncycastle.crypto.digests.SM3Digest; import org.bouncycastle.crypto.engines.SM2Engine; import org.bouncycastle.crypto.params.ParametersWithID; import org.bouncycastle.crypto.params.SM2KeyExchangePrivateParameters; import org.bouncycastle.crypto.params.SM2KeyExchangePublicParameters; import org.bouncycastle.crypto.params.SM2PrivateKeyParameters; import org.bouncycastle.crypto.params.SM2PublicKeyParameters; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.SecureRandom; import java.security.Security; public class SM2Demo { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); // 私钥,从配置文件或数据库中读取 String privateKeyStr = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; // 将私钥转换为 sm2 私钥对象 byte[] privateKeyBytes = Hex.decode(privateKeyStr); SM2PrivateKeyParameters privateKey = new SM2PrivateKeyParameters(privateKeyBytes, SM2Util.DOMAIN_PARAMS); // 加密后的数据,从前端接收 String encryptedDataStr = "QXZlbnQgUGF5bG9hZA=="; byte[] encryptedData = Base64.decode(encryptedDataStr); // 使用 sm2 解密数据 SM2Engine engine = new SM2Engine(); engine.init(false, new ParametersWithID(null, null)); engine.processCiphertext(encryptedData, 0, encryptedData.length); byte[] decryptedData = engine.doFinal(); // 输出解密结果 System.out.println(new String(decryptedData)); } } ``` 需要注意的是,在上面的示例代码中,我们使用了 BouncyCastle 提供的 sm2 实现。如果你使用的是其它实现,则代码可能会有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值