SpringBoot使用rsa-encrypt-body-spring-boot实现接口加解密

废话不多说,直接上代码

引入依赖

<dependency>
    <groupId>cn.shuibo</groupId>
    <artifactId>rsa-encrypt-body-spring-boot</artifactId>
    <version>1.0.1.RELEASE</version>
</dependency>

配置文件

rsa:
  encrypt:
    # 是否开启加密
    open: true
    # 是否打印加解密log
    showLog: true
    # RSA公钥
    publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn0MVxeKJM36xHVlivHBMfr5hY+UwLGGJ6H32zV5rruX38grA46CeZWncTEKq2QYrrvsyN6FU+gQeA9vXyeXypeAe8Hmv2dfVo2o+5vLO4E13KBoqT6iADEmfPkA/fkg32r/qzxK/DzMUBkkil8cqqH5+QSsLpvTB/F4FalNoB6k7Fov83Pqlc19f6nXDfWoFr4+fAONcwnBzSMr2JhLNIZsM2WPmu3JdxaVUX9a6lpSrlsFU1uDszWmLjI8nwKdudISqqGLDyaATlm88z4xaqVPlbPNeG4Ht+TNNRHGFXfD6XlTb9O9AhQ2S6Rmc/N+lg3pT8oJ9z9KndkdkuphHfQIDAQAB
    # RSA私钥
    privateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCfQxXF4okzfrEdWWK8cEx+vmFj5TAsYYnoffbNXmuu5ffyCsDjoJ5ladxMQqrZBiuu+zI3oVT6BB4D29fJ5fKl4B7wea/Z19Wjaj7m8s7gTXcoGipPqIAMSZ8+QD9+SDfav+rPEr8PMxQGSSKXxyqofn5BKwum9MH8XgVqU2gHqTsWi/zc+qVzX1/qdcN9agWvj58A41zCcHNIyvYmEs0hmwzZY+a7cl3FpVRf1rqWlKuWwVTW4OzNaYuMjyfAp250hKqoYsPJoBOWbzzPjFqpU+Vs814bge35M01EcYVd8PpeVNv070CFDZLpGZz836WDelPygn3P0qd2R2S6mEd9AgMBAAECggEABtuWpmy4x7Te34qny8FyKcr82pZV2rNggthZtkIolOFmKc/4ulSCPY+vYsFEJhAz9VbvtKGHzTQ8LqJaymDSb/4UlvpGbjTzCBRdHQi7i8EKLnnh9Igm62CIMOAHW+K0NQEqlTwTag4jAJpJmQuEdLjtqtS1rbzAVaOezBNHWX0IisgKL1TP6naHn/mJPujx7zodquTy3PwrXbwv/E2gwLeTCjLBcbHBuq4Z9MQ8vA7ztMgbwILtIPcEVtNLIxUKFGXZQUgzwirTNPHJDYVcuzsi4mx10BwPy0Uyw2OdH/k6B85OQS9lps6Bv5mOng4xRBD2EODXM3QDnIE8UTtkKQKBgQDe8sYTlq/MnKc5VcQWsLSezHtmibd2CZ55Q7c6iRO+fgCYKHGmXosmik8X/mISijq65jUR6vUrGJaZ4SBLG4Vdu4hs0RwPtGyHf3OXmKecwYYiypf0xfG9DQbiKw+OuRiJXeT4InZxPDrZKH41OKHoL/eTEpeHoE9MZ90epQX6awKBgQC231IR+Ol8jkmmoDNJspCtFeARjCliGflQwLfFuprPpqhyt1Cg1/x+245sBLoCMWRNm1ZT638cnQsRzB/C2QGqQ8l44pL95Ffj7HAf7NTvM3kFcOK87Cmw5Hae73ARiIKft6cKJoGfuxxWIwGIGLb/WAakZ4viYgW1XLd9MnIPtwKBgAp8DEibi4Tp0QtnNyOCB9x37U2zKEeKyEMXpiRAkgchUdHWBRI32/9h/bo5Ik+Q5JYpgVFoZUMzktGFvskJcEoqKY5EfzdV2sy8d6knaqp6h15XfLHsJSQo2qwELmUd20OKgNwSctN8a6AOwXCrSyHqL5BhDXM5XMFRGRr508AlAoGALNrsG4JtauLPx/Ilgl8tQ3dJJaS2hdyPHbKXoQVbcbGUQccbHMi9ozQhY/do1J7e1nZSn3T1EcSncW8bH0TxNp037tHMckAvGrXk7r+9nwqGFcKRqvtWYpA3VFawq2xLdferHj9BrjdMBQjDGGnPgSRLRMotMpMOiWS7kRbtiVMCgYBmQKXaPHjkXtreFG8XJFsCTLV0aV4yTMF5mqqkxHmXm+PZq+qvJf8F0NZollj7AKOrIkTEcw6waeHwu2zD8j+xQP4AjU8SMZZfwnj9Sr5Vc6AFFZHYHr6n9VfSF+puoDcmaU6MLqcOI9qpJmHKe5F2+HhgDlVGDVH60BrjQwGUnw==
    

开启加解密

package com.qiangesoft.encryption;

import cn.shuibo.annotation.EnableSecurity;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 启动器
 *
 * @author qiangesoft
 * @date 2024-05-22
 */
@EnableSecurity
@SpringBootApplication
public class EncryptionApplication {

    public static void main(String[] args) {
        SpringApplication.run(EncryptionApplication.class, args);
    }

}

案例

package com.qiangesoft.encryption.controller;

import cn.shuibo.annotation.Decrypt;
import cn.shuibo.annotation.Encrypt;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

/**
 * 测试
 *
 * @author qiangesoft
 * @date 2024-05-22
 */
@Slf4j
@RequestMapping("/test")
@RestController
public class TestController {

    @Encrypt
    @GetMapping("/encryption")
    public UserDTO encryption() {
        UserDTO userDTO = new UserDTO();
        userDTO.setUsername("admin");
        userDTO.setPassword("123456");
        userDTO.setNickname("超级管理员");
        userDTO.setSex("男");
        userDTO.setAge(29);
        userDTO.setTelephone("13333333333");
        userDTO.setAddress("北京市西城区");
        return userDTO;
    }

    @Decrypt
    @PostMapping("/decryption")
    public UserDTO decryption(@RequestBody UserDTO userDTO) {
        return userDTO;
    }

}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button onclick="encryption()">加密提交</button>
<button onclick="decryption()">解密数据</button>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.js"></script>
<script>

    const PUBLIC_KEY = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn0MVxeKJM36xHVlivHBMfr5hY+UwLGGJ6H32zV5rruX38grA46CeZWncTEKq2QYrrvsyN6FU+gQeA9vXyeXypeAe8Hmv2dfVo2o+5vLO4E13KBoqT6iADEmfPkA/fkg32r/qzxK/DzMUBkkil8cqqH5+QSsLpvTB/F4FalNoB6k7Fov83Pqlc19f6nXDfWoFr4+fAONcwnBzSMr2JhLNIZsM2WPmu3JdxaVUX9a6lpSrlsFU1uDszWmLjI8nwKdudISqqGLDyaATlm88z4xaqVPlbPNeG4Ht+TNNRHGFXfD6XlTb9O9AhQ2S6Rmc/N+lg3pT8oJ9z9KndkdkuphHfQIDAQAB';

    const PRIVATE_KEY = 'MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCfQxXF4okzfrEdWWK8cEx+vmFj5TAsYYnoffbNXmuu5ffyCsDjoJ5ladxMQqrZBiuu+zI3oVT6BB4D29fJ5fKl4B7wea/Z19Wjaj7m8s7gTXcoGipPqIAMSZ8+QD9+SDfav+rPEr8PMxQGSSKXxyqofn5BKwum9MH8XgVqU2gHqTsWi/zc+qVzX1/qdcN9agWvj58A41zCcHNIyvYmEs0hmwzZY+a7cl3FpVRf1rqWlKuWwVTW4OzNaYuMjyfAp250hKqoYsPJoBOWbzzPjFqpU+Vs814bge35M01EcYVd8PpeVNv070CFDZLpGZz836WDelPygn3P0qd2R2S6mEd9AgMBAAECggEABtuWpmy4x7Te34qny8FyKcr82pZV2rNggthZtkIolOFmKc/4ulSCPY+vYsFEJhAz9VbvtKGHzTQ8LqJaymDSb/4UlvpGbjTzCBRdHQi7i8EKLnnh9Igm62CIMOAHW+K0NQEqlTwTag4jAJpJmQuEdLjtqtS1rbzAVaOezBNHWX0IisgKL1TP6naHn/mJPujx7zodquTy3PwrXbwv/E2gwLeTCjLBcbHBuq4Z9MQ8vA7ztMgbwILtIPcEVtNLIxUKFGXZQUgzwirTNPHJDYVcuzsi4mx10BwPy0Uyw2OdH/k6B85OQS9lps6Bv5mOng4xRBD2EODXM3QDnIE8UTtkKQKBgQDe8sYTlq/MnKc5VcQWsLSezHtmibd2CZ55Q7c6iRO+fgCYKHGmXosmik8X/mISijq65jUR6vUrGJaZ4SBLG4Vdu4hs0RwPtGyHf3OXmKecwYYiypf0xfG9DQbiKw+OuRiJXeT4InZxPDrZKH41OKHoL/eTEpeHoE9MZ90epQX6awKBgQC231IR+Ol8jkmmoDNJspCtFeARjCliGflQwLfFuprPpqhyt1Cg1/x+245sBLoCMWRNm1ZT638cnQsRzB/C2QGqQ8l44pL95Ffj7HAf7NTvM3kFcOK87Cmw5Hae73ARiIKft6cKJoGfuxxWIwGIGLb/WAakZ4viYgW1XLd9MnIPtwKBgAp8DEibi4Tp0QtnNyOCB9x37U2zKEeKyEMXpiRAkgchUdHWBRI32/9h/bo5Ik+Q5JYpgVFoZUMzktGFvskJcEoqKY5EfzdV2sy8d6knaqp6h15XfLHsJSQo2qwELmUd20OKgNwSctN8a6AOwXCrSyHqL5BhDXM5XMFRGRr508AlAoGALNrsG4JtauLPx/Ilgl8tQ3dJJaS2hdyPHbKXoQVbcbGUQccbHMi9ozQhY/do1J7e1nZSn3T1EcSncW8bH0TxNp037tHMckAvGrXk7r+9nwqGFcKRqvtWYpA3VFawq2xLdferHj9BrjdMBQjDGGnPgSRLRMotMpMOiWS7kRbtiVMCgYBmQKXaPHjkXtreFG8XJFsCTLV0aV4yTMF5mqqkxHmXm+PZq+qvJf8F0NZollj7AKOrIkTEcw6waeHwu2zD8j+xQP4AjU8SMZZfwnj9Sr5Vc6AFFZHYHr6n9VfSF+puoDcmaU6MLqcOI9qpJmHKe5F2+HhgDlVGDVH60BrjQwGUnw==';

    /**
     * 加密提交
     */
    function encryption() {
        var data = {
            username: "admin",
            password: "123456",
            nickname: "超级管理员",
            sex: "男",
            age: "29",
            telephone: "13111111111",
            address: "北京市西城区"
        };
        // 加密
        var encrypt = new JSEncrypt();
        encrypt.setPublicKey(PUBLIC_KEY);
        var encrypted = encrypt.encrypt(JSON.stringify(data));
        console.log('加密前数据:%o', data);
        console.log('加密后数据:%o', encrypted);

        $.ajax({
            url: "/test/decryption",
            type: "POST",
            contentType: "application/json;charset=utf-8",
            data: encrypted,
            success: function (data) {
                console.log(JSON.stringify(data))
            }
        })
    }

    /**
     * 解密数据
     */
    function decryption() {
        $.ajax({
            url: "/test/encryption",
            type: "GET",
            contentType: "application/json;charset=utf-8",
            success: function (data) {
                var decrypt = new JSEncrypt();
                decrypt.setPrivateKey(PRIVATE_KEY);
                var relData = decrypt.decrypt(data);
                console.log('加密前数据:%o', data);
                console.log('加密后数据:%o', relData);
            }
        })
    }
</script>
</body>
</html>

后台解密

在这里插入图片描述

2024-05-22 15:40:50.778  INFO 5500 --- [nio-8033-exec-3] c.shuibo.advice.DecryptHttpInputMessage  : Encrypted data received:il2zExRKOcC4XMT2TQwSdnejCkPtxOx1K+T5hrsmFmIohxbS8xwXl3O4ypHwSsgKUnAPPAUJV0OnSaNBuoi/KcoeHAjhJb6GugWm/VJCejw0mC0tg3onoPVUOUjRm+lHlymzSXiculpvz8qee+WaKjRRRW//85P9QPSSeKV1HrwJ1AFbT7QNMVpwax8EXX9yrGFPcN1tzpBBN1AyKtWVNcdSvFMSrubE7PAaibvoT0GKjhw/J52UhKzX96cc6A26fz64FkvGcOZGqlVARdpyXL3Cvqk4/uRKDSE6sUgyZ3rOsLkdXiNVqS0r8zA37IUyFAP3yoPH5Uk7z9mgbhsw2g==,After decryption:{"username":"admin","password":"123456","nickname":"超级管理员","sex":"男","age":"29","telephone":"13111111111","address":"北京市西城区"}

后台加密

在这里插入图片描述

2024-05-22 15:43:17.334  INFO 5500 --- [nio-8033-exec-5] c.s.advice.EncryptResponseBodyAdvice     : Pre-encrypted data:{"address":"北京市西城区","age":29,"nickname":"超级管理员","password":"123456","sex":"男","telephone":"13333333333","username":"admin"}After encryption:HhZx25AZgh+d7MIu0rh07zZam2boxDFNNMO/hWssCsYDR4Qf2+/6Z5KVIQcP3Bf73uGEQD81tRznUasMvYIt1Kt8MAomOhz2GIkauJw1ZwnD03kyLVwlGrFWote3giwj8LiJ4knjlFDbHsYgHN/3PWpCbWIm0IjWgv0T98MZFWSyGOaR+ZBr8ckdQrCAN3XMd3zwICxitQ4aYc0asElTwMybj+8u5p4Jla1WwpJ+VeB7UYXhvNWM06mQK/JwXGrZ/YN3thDUGu1GAxCMtnkIGFk5jNCFzaC8pvAavW4H1WIppO0JFzbrQWcVU2dtr61VKwsn/V3FVGFbG7HmrhZ8yJgGXtzE8eDTBliN/CpOF975BQjQT49i89DYozr76kdDgjIYdLna/9P6ESC9fR2hYqaYKs1kOmiWS+OLwr97Nz+3EViYOCgfdYO/Il6lXMeuGksddBls9m0RWXgKAkxLq6P/UyLM6I3PZk+lkc5YrPg7swaRE3yySRBIzIq1NalELXZ+3yfywbfKhDYrR8dAW7sFbwDkHu3LjqQ7u3cKfYTvxLUK20XgQCr2APWlNnbASkn6/3GXwt3ZeDp9lCl/bXXsX8GiArcRPiV5/Qb8CZJUE2/YpU1haq/J9rPwa8L5y/1O3yLyt/aWQi1r+G/eQbXJzYACqp954My8bNwDVhg=

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果你想使用 Bouncy Castle 作为 RSA2 签名算法的实现,可以按照以下步骤进行: 1. 引入 Bouncy Castle 的依赖 ```xml <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.68</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.68</version> </dependency> ``` 2. 在配置文件中配置 RSA2 的公钥和私钥 ```properties # RSA2 公钥 alipay.publicKey= # RSA2 私钥 alipay.privateKey= ``` 3. 创建 RSA2 工具类 ```java import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.Security; import java.security.Signature; import java.security.interfaces.RSAPrivateKey; import java.security.spec.PKCS8EncodedKeySpec; import java.util.Base64; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class AlipayUtil { static { Security.addProvider(new BouncyCastleProvider()); } private static final String CHARSET = "UTF-8"; private static final String SIGN_TYPE = "RSA2"; private static final String FORMAT = "JSON"; private static String appId; private static String privateKey; private static String publicKey; public static void setAppId(String appId) { AlipayUtil.appId = appId; } public static void setPrivateKey(String privateKey) { AlipayUtil.privateKey = privateKey; } public static void setPublicKey(String publicKey) { AlipayUtil.publicKey = publicKey; } public static String generateOrder(String subject, String body, String outTradeNo, String totalAmount, String notifyUrl) throws GeneralSecurityException, IOException { String content = "{" + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\"," + "\"out_trade_no\":\"" + outTradeNo + "\"," + "\"timeout_express\":\"30m\"," + "\"total_amount\":\"" + totalAmount + "\"," + "\"product_code\":\"QUICK_MSECURITY_PAY\"" + "}"; String sign = rsa256Sign(content, privateKey, CHARSET); String orderString = "{" + "\"app_id\":\"" + appId + "\"," + "\"method\":\"alipay.trade.app.pay\"," + "\"format\":\"" + FORMAT + "\"," + "\"charset\":\"" + CHARSET + "\"," + "\"sign_type\":\"" + SIGN_TYPE + "\"," + "\"timestamp\":\"" + System.currentTimeMillis() + "\"," + "\"version\":\"1.0\"," + "\"notify_url\":\"" + notifyUrl + "\"," + "\"biz_content\":" + content + "," + "\"sign\":\"" + sign + "\"" + "}"; return orderString; } private static String rsa256Sign(String content, String privateKey, String charset) throws GeneralSecurityException, IOException { PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateK); signature.update(content.getBytes(charset)); byte[] signed = signature.sign(); return Base64.getEncoder().encodeToString(signed); } } ``` 4. 在需要使用 RSA2 的地方调用工具类进行支付 ```java try { String orderString = AlipayUtil.generateOrder("测试商品", "测试商品描述", "123456789", "0.01", "http://xxxxx"); // 将订单字符串返回给前端,前端使用支付宝SDK进行支付 } catch (GeneralSecurityException | IOException e) { e.printStackTrace(); } ``` 需要注意的是,Bouncy Castle 的依赖包中已经包含了 JCE Provider,因此不需要再配置 javax.crypto.JCE_PROVIDER 系统属性。另外,生成订单字符串后需要将其返回给前端使用支付宝SDK进行支付。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PG_强哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值