Skip to content

catcancry/st-encrypt

Repository files navigation

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

<dependency>
    <groupId>vip.ylove</groupId>
    <artifactId>st-encrypt-sdk</artifactId>
    <version>3.0.1</version>
</dependency>
或者
<dependency>
    <groupId>vip.ylove</groupId>
    <artifactId>st-encrypt-sdk-spring-boot-starter</artifactId>
    <version>3.0.1</version>
</dependency>
  • 以springboot以Maven为例,在pom.xml中引入依赖
<dependency>
    <groupId>vip.ylove</groupId>
    <artifactId>st-encrypt-sdk-spring-boot-starter</artifactId>
    <version>3.0.1</version>
</dependency>
  • 启动类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> T toBean(String data, Class<T> cls) {
                return JSONObject.parseObject(data,cls);
            }

            @Override
            public <T> T toBean(byte[] data, Class<T> cls) {
                return JSONObject.parseObject(data,cls);
            }
        };
    }
}
  1. 在和springboot进行集成的时候,在一些场景下例如需要进行xss参数过滤时候, 参数已经被加密,许多框架是在filter层过滤处理就会失败,因为在filter层参数还是加密的状态 可以调整代码在HandlerInterceptor进行xss过滤, 可以参考代码vip.ylove.server.advice.dencrypt.StRequestHandlerIntercepter 这个类的代码进行处理
  1. 目前支持GET,POST等,包括一般get请求,post json请求,post表单请求,和文件上传请求 可以参考提供的demo实现客户端和第三方调用

🍩感谢

  • 感谢 JetBrains 为 st-encrypt 提供的 IDEA License。