# st-encrypt
**Repository Path**: linkhome/st-encrypt
## Basic Information
- **Project Name**: st-encrypt
- **Description**: 基于【数字信封】, 对请求进行加密解密,解决请求明文传输,防劫持,防篡改,防伪造,与springboot快速集成开发服务端,提供sdk供第三方调取接口,提供前端调接口实现,具体参考example:包括了服务端,第三方,和前端调取接口
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 12
- **Created**: 2025-06-13
- **Last Updated**: 2025-06-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
### 1.介绍
**st-encrypt-sdk**
Spring Boot接口加密,可以对返回值、参数值通过注解的方式自动加解密
3.0版本支持sprintgboot3.x,1.2.1支持springboot2.x
调用端发送的请求信息
```
{
key:RSA公钥加密(随机AES_KEY###时间搓t###appId###授权auth),使用###分隔,其中appId,授权auth可以为null
data:AES 加密(data数据)
}
```
----
- 1.AES加密内容效率远高于RSA,并且拥有一定的安全性。
- 2.rsa公钥加密了key,劫持者无法获取key和相关授权信息,既保证保障data的安全和又保证了授权信息不会被盗用。
- 3.有appId和auth的存在,保障了劫持者无法伪造内容。
服务器端
使用RSA私钥解密得到AES的KEY、授权Auth和appId ,可以验证本次请求是否有效
通过解密的到AES_key解密加密的data,获取到数据-->处理结果-->使用AES_key的key加密响应结果,并使用私钥进行MD5withRSA(data)签名内容,响应调用端
```
{
data:AES_key加密(data数据)
sign:私钥进行MD5withRSA(data)
}
```
- 1.每次请求的AES_KEY不同,AES_KEY保存浏览器内存,并且RSA_公钥加密传输,劫持者从始至终都不知道AES_KEY,保证了响应内容,劫持者无法伪造服务器的响应结果
安全是相对的,只看价值和付出
### 2.使用方法
**Maven**
```
vip.ylove
st-encrypt-sdk
3.0.1
或者
vip.ylove
st-encrypt-sdk-spring-boot-starter
3.0.1
```
- **以springboot以Maven为例,在pom.xml中引入依赖**
```
vip.ylove
st-encrypt-sdk-spring-boot-starter
3.0.1
```
- **启动类Application中添加@StEnableSecurity注解**
```
@SpringBootApplication
@StEnableSecurity
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
```
- **在application.yml添加RSA公钥及私钥**
```
st:
encrypt:
privateKey: '' #rsa私钥 作为服务端时需要配置
publicKey: '' #rsa私钥 作为客户端时需要配置
appId: '' #appId 授权id 作为客户端时需要配置 也可以为空
auth: '' #auth 授权秘钥 作为客户端时需要配置 也可以为空
```
- **对请求进行解密,响应结果进行加密**
```
@StEncrypt
@PostMapping("/encrypt")
public BaseResult encrypt(@RequestBody Object form){
log.info("{}",form);
return BaseResult.success_(form);
}
```
- **若需要验证授权信息,实现StAbstractAuth接口就可以**
```
@Service
public class StAuthService implements StAbstractAuth {
@Override
public boolean auth(String appId, String auth, String t, StEncrypt stEncrypt) {
//模拟进行授权验证
log.info("默认认证方式:appId[{}]-auth[{}]-t[{}]-stEncrypt[{}]",appId, auth,t,stEncrypt);
if ("123456".equals(appId) && "123456".equals(auth)) {
return true;
}
log.debug("授权验证未通过");
return false;
}
@Override
public String key() {
String key = StAbstractAuth.super.key();
//若没有获取到动态key,则可以在此处获取静态key,例如token,jwt中等
return key;
}
}
```
- **第三方调用接口**
```
//加密请求参数
StResquestBody encrypt = StClientUtil.encrypt(stConfig.getPublicKey(),
System.currentTimeMillis(),
stConfig.getAppId(),
stConfig.getAppAuth(), form);
//发送请求
EncryptResult stEncryptBody = serverService.encrypt(encrypt);
Object result = null;
if( stEncryptBody.isSuccess()){
//解密数据
result = StClientUtil.dencrypt(stConfig.getPublicKey(), stEncryptBody);
}else{
result = stEncryptBody;
}
```
- **若需要修改默认的json序列化工具Jackson,只需要实现StAbstractJsonDcode接口就可以**
```
/**
* 配置加解密使用fastjson
*/
@Configuration
public class ConfigStJsonDcode {
@Bean
public StAbstractJsonDcode initStAbstractJsonCode(){
return new StAbstractJsonDcode(){
@Override
public String toJson(Object data) {
return JSONObject.toJSONString(data);
}
@Override
public T toBean(String data, Class cls) {
return JSONObject.parseObject(data,cls);
}
@Override
public T toBean(byte[] data, Class cls) {
return JSONObject.parseObject(data,cls);
}
};
}
}
```
>1. 在和springboot进行集成的时候,在一些场景下例如需要进行xss参数过滤时候,
> 参数已经被加密,许多框架是在filter层过滤处理就会失败,因为在filter层参数还是加密的状态
> 可以调整代码在HandlerInterceptor进行xss过滤,
> 可以参考代码vip.ylove.server.advice.dencrypt.StRequestHandlerIntercepter 这个类的代码进行处理
>2. 目前支持GET,POST等,包括一般get请求,post json请求,post表单请求,和文件上传请求
可以参考提供的demo实现客户端和第三方调用
### 🍩感谢
- 感谢 JetBrains 为 st-encrypt 提供的 IDEA License。
