add 添加解密经 @ApiEncrypt 加密后的接口请求/响应功能

This commit is contained in:
莫小波 2025-09-03 13:38:14 +08:00
parent ff7fc594d0
commit ea39be41bc
5 changed files with 107 additions and 0 deletions

View File

@ -176,10 +176,12 @@ api-decrypt:
headerFlag: encrypt-key
# 响应加密公钥 非对称算法的公私钥 如SM2RSA 使用者请自行更换
# 对应前端解密私钥 MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=
privateKeyResponse: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=
publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJnNwrj4hi/y3CCJu868ghCG5dUj8wZK++RNlTLcXoMmdZWEQ/u02RgD5LyLAXGjLOjbMtC+/J9qofpSGTKSx/MCAwEAAQ==
# 请求解密私钥 非对称算法的公私钥 如SM2RSA 使用者请自行更换
# 对应前端加密公钥 MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==
privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y=
publicKeyRequest: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==
springdoc:
api-docs:

View File

@ -21,6 +21,11 @@ public class ApiDecryptProperties {
*/
private String headerFlag;
/**
* 响应加密私钥
*/
private String privateKeyResponse;
/**
* 响应加密公钥
*/
@ -31,4 +36,9 @@ public class ApiDecryptProperties {
*/
private String privateKey;
/**
* 请求解密公钥
*/
private String publicKeyRequest;
}

View File

@ -0,0 +1,56 @@
package org.dromara.system.controller.decrypt;
import org.dromara.common.core.domain.R;
import org.dromara.system.domain.bo.SysDecryptBo;
import org.dromara.system.domain.vo.SysDecryptVo;
import org.dromara.common.encrypt.properties.ApiDecryptProperties;
import org.dromara.common.encrypt.utils.EncryptUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.dev33.satoken.annotation.SaCheckPermission;
import lombok.RequiredArgsConstructor;
/**
* 请求/响应解密
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/tool/decrypt")
public class SysDecryptController {
private final ApiDecryptProperties properties;
/**
* 请求解密
*/
@PostMapping("/request")
@SaCheckPermission("tool:decrypt:query")
public R<SysDecryptVo> decryptRequest(@Validated @RequestBody SysDecryptBo bo) {
String aesKey = EncryptUtils.decryptByRsa(bo.getEncryptKey(), properties.getPrivateKey());
String data = EncryptUtils.decryptByAes(bo.getData(), EncryptUtils.decryptByBase64(aesKey));
SysDecryptVo vo = new SysDecryptVo();
vo.setAesKey(aesKey);
vo.setData(data);
return R.ok(vo);
}
/**
* 响应解密
*/
@PostMapping("/response")
@SaCheckPermission("tool:decrypt:query")
public R<SysDecryptVo> decryptResponse(@Validated @RequestBody SysDecryptBo bo) {
String aesKey = EncryptUtils.decryptByRsa(bo.getEncryptKey(), properties.getPrivateKeyResponse());
String data = EncryptUtils.decryptByAes(bo.getData(), EncryptUtils.decryptByBase64(aesKey));
SysDecryptVo vo = new SysDecryptVo();
vo.setAesKey(aesKey);
vo.setData(data);
return R.ok(vo);
}
}

View File

@ -0,0 +1,21 @@
package org.dromara.system.domain.bo;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
@Data
public class SysDecryptBo {
/**
* AES 秘钥经 RSA 加密后的内容对应 header encrypt-key
*/
@NotEmpty(message = "encryptKey 不能为空")
private String encryptKey;
/**
* 待解密数据
*/
@NotEmpty(message = "待解密数据不能为空")
private String data;
}

View File

@ -0,0 +1,18 @@
package org.dromara.system.domain.vo;
import lombok.Data;
@Data
public class SysDecryptVo {
/**
* RSA 解密后的 AES 秘钥
*/
private String aesKey;
/**
* 解密后的数据
*/
private String data;
}