乐趣区

关于spring:SpringBoot增强库-yuelibrary-232发布优雅实现密钥交换加解密

yue-library 简介

yue-library 是一个基于 SpringBoot 封装的加强库

  • 内置丰盛的 JDK 工具
  • 主动拆卸了一系列的根底 Bean 与环境配置项
  • 疾速构建 SpringCloud 我的项目,让微服务变得更简略

版本更新日志

此版本重点实现:密钥替换加解密 加强 Bean 转换能力JDBC 新增 Elasticsearch-SQL、达梦、PostgreSQL 方言

新个性

  • 【base】ParamUtils 提醒优化,增加谬误起因
  • 【base】增加 JSONListConverter 类型转换器从而反对 List<JSONObject> 类型解决(JDBC 实体数据库查问映射时 JSONArray 格局文本数据不反对映射成List<JSONObject>
  • 【base】优化 fastjson bean 转换的 jsonstr 辨认形式
  • 【base】加强 DateUtils 与标准 UUID 工具类为 IdUtils 并优化 IdUtils 实现
  • 【base】加强 fastjson JavaBean 转换能力,反对 Character 类型
  • 【base】MapUtils 加强值提取,反对 list 依据 key 提取 map 提取值反对 map、fastjson pulls !17
  • 【crypto】新增重磅个性 - 密钥替换加密:反对 @RequestDecrypt 注解实现申请主动解密
  • 【crypto】新增重磅个性 - 密钥替换加密:反对 @ResponseEncrypt 注解实现响应内容加密
  • 【crypto】密钥替换加密:默认提供本地 Map 与 Redis 两种替换密钥存储计划
  • 【crypto】密钥替换加密:@RequestDecrypt@ResponseEncrypt 注解反对应用替换密钥加密或自定义密钥等个性
  • 【web】修复 ApiVersion 注解 minimumVersion 值等于的状况下 410
  • 【web】优化响应后果处理器在规范 HTTP 状态码时的空值解决
  • 【web】新增 ServletUtils.getAuthToken()办法,获取申请中的 OAuth2 Token
  • 【webflux】修复 ApiVersion 注解 minimumVersion 值等于的状况下 410
  • 【jdbc】对 jdbc 方言实现进行欠缺与优化,新增 Elasticsearch-SQL、达梦、PostgreSQL 方言
  • 【jdbc】db.queryForObject 自动识别 Bean 类型与简略类型
  • 【jdbc】参数丑化加强反对 JSONArray 数据类型与 List<JSONObject> 数据类型
  • 【jdbc】优化多行查问后果转换为单行查问后果实现
  • 【jdbc】所有 mappedClass 查询方法自动识别所需 RowMapper 类型,实现 JavaBean、map、根本类型后果主动匹配
  • 【jdbc】标准外部局部常量命名与移除分页中不优雅的泛型实例 PageTVO
  • 【jdbc】加强主动方言辨认,依据驱动类自动识别所需方言类型
  • 【jdbc】默认 Db Bean 实现依据不同驱动类型,应用对应方言配置
  • 【jdbc】优化 DAO 实现,形象根底 DAO
  • 【jdbc】优化所有 jdbc 办法正文,形容更简洁,表白更清晰,正文更标准
  • 【jdbc】删除晚期存在的局部过期办法
  • 【es】反对配置 ConnectTimeout 与 SocketTimeout,并调大各自默认值为 25 与 15 秒

Bug 修复

  • 【base】修复 fastjson JavaBean 转换 BUG #3688
  • 【jdbc】修复 isDataSize()办法可能因为数据库存在多行数据,而返回 false 的隐患
  • 【jdbc】修复因谬误测试而删除的参数类型丑化(现已反对:Character、JSONObject、LocalDateTime 进行非凡转换解决与布尔值映射辨认)

Maven 仓库理论公布版本号

j8.2.3.2j11.2.3.2

要害 pom.xml 依赖:

依赖 版本
spring-boot 2.3.8.RELEASE
spring-cloud Hoxton.SR10
spring-cloud-alibaba 2.2.5.RELEASE
hutool 5.6.3
fastjson 1.2.76

工程构造

. yue-library
├── yue-library  根底库
│   ├── yue-library-dependencies  父 pom
│   ├── yue-library-base          根底库提供了丰盛的 Java 工具包,同时也主动拆卸了一系列根底 Bean 等
│   ├── yue-library-base-crypto   基于 Hutool 实现的加解密模块,提供诸如数据脱敏此类的更多个性
│   ├── yue-library-web           根底库 WebMvc 实现,用于 servlet 我的项目
│   ├── yue-library-webflux       根底库 WebFlux 实现,用于响应式编程我的项目(如:SpringCloudGateway)│   ├── yue-library-data-jdbc     基于 SpringJDBC 进行二次封装,领有着弱小性能的同时又不失简略、灵便等
│   ├── yue-library-data-redis    基于 SpringRedis 进行二次封装,更简略灵便,提供全局 token 与登录相干个性等
│   ├── yue-library-auth-service  基于 SpringSecurity 进行二次封装,更简略灵便,提供全局 token 与登录等个性
│   ├── yue-library-auth-client   auth-client 为 auth-service 客户端模块,提供获取以后登录用户状态信息等个性
│   ├── yue-library-pay           基于 pay-java-parent 进行二次封装,让你真正做到一行代码实现领取聚合
│   ├── yue-library-cloud-oss
│   └── yue-library-cloud-sms
├── yue-library-samples  根底库示例
│   ├── yue-library-test        yue-library 代码测试项目:单元测试、接口测试、代码示例
│   ├── yue-library-test-webflux    yue-library-webflux 代码测试项目:单元测试、接口测试、代码示例
│   ├── yue-library-template-simple    yue-library 模版:SpringBoot 我的项目模版
│   └── yue-library-template-ssc    yue-library 模版:SpringCloud 我的项目模版,SOA 共享架构(阿里巴巴中台)└── yue

疾速开始

引入我的项目依赖

maven 我的项目,在 pom.xml 文件中增加如下一段代码,并将 ${version} 替换为对应版本号:

<parent>
    <groupId>ai.ylyue</groupId>
    <artifactId>yue-library-dependencies</artifactId>
    <version>${version}</version>
</parent>

随后引入所须要的模块,如 WebMvc 我的项目引入:yue-library-web

依赖阐明:yue-library-base为根底模块,个别状况下不须要独自引入,如:web、data-jdbc、data-redis 等模块皆已默认依赖。

<dependencies>
    <dependency>
        <groupId>ai.ylyue</groupId>
        <artifactId>yue-library-web</artifactId>
    </dependency>
    ...
</dependencies>

启动我的项目

新建一个 SpringBoot main办法启动类:

@SpringBootApplication
public class TestApplication {public static void main(String[] args) throws Exception {SpringApplication.run(TestApplication.class, args);
    }

}

写一个测试接口:

@RestController
@RequestMapping("/quickstart")
public class QuickstartController {@GetMapping("/get")
    public Result<?> get(JSONObject paramJson) {return ResultInfo.success(paramJson);
    }
    
}

拜访接口测试,如:http://localhost:8080/quickst…

{
    "code": 200,
    "msg": "胜利",
    "flag": true,
    "count": null,
    "data": {}}

密钥替换

密钥替换加密能够实现如下几个个性:

  • 每次会话的密钥时随机的,客户端与服务端当时无需约定
  • 密钥未间接存储在客户端与服务端中,防止了泄露危险
  • 密钥替换过程中,密钥的传输是加密的

密钥替换流程

密钥替换步骤一:客户端申请传输加密公钥

  1. 客户端应用密钥存储 key,申请取得服务端公钥(用于步骤二申请加密)

    • 密钥存储 key:作为会话惟一键,在步骤一、步骤二、步骤三中属于必填参数
    • 密钥存储 key:在用户未登录时个别会随机生成一个 UUID,用户登陆后再用 token 作为别名
    • 密钥存储 key:用户已登录状况,个别会以用户本次会话 token 作为存储 key
  2. 服务端收到申请后,生成用于后续传输加解密的公私钥并绑定存储 key
  3. 服务端将生成的公钥返回给客户端

密钥替换步骤二:客户端申请最终替换密钥

  1. 客户端取得服务端的公钥后,创立客户端本身的公私钥
  2. 客户端应用 服务端的公钥 加密 本身生成的公钥,向服务端申请最终的替换密钥
  3. 服务端应用私钥解密取得客户端公钥
  4. 服务端生成最终替换密钥,并应用客户端公钥进行响应加密
  5. 客户端取得加密的替换密钥后应用 客户端私钥解密,取得替换密钥

密钥替换步骤三(可选):客户端为服务端密钥的存储 key 增加别名

  • 实用场景:

    • 步骤一时用户未登录,应用长期的 UUID 作为服务端密钥存储 key,用户登录后想应用 token 作为密钥存储 key,不便后续传输

应用替换密钥加解密

  1. 客户端取得替换密钥后,申请须要参数加密的接口时,以约定的形式带上密钥存储 key,并加密申请参数

    • 约定形式:默认为 OAuth2 Token 认证,故:若步骤一应用 UUID 作为存储 key,需将 token 增加为存储别名
    • 约定形式:除默认形式外反对:Header 传参约定、URL Param 传参约定(具体传参 key 为服务端定义,默认 key 值:Yue-ExchangeKey-StorageKey
  2. 服务端解密参数解决业务逻辑后,应用 @ResponseEncrypt 注解主动加密响应的 data 参数
  3. 客户端解密响应后果

接口阐明

默认算法名称

  • RSA_AES:

        /** RSA 算法,此算法用了默认补位形式为 RSA/ECB/PKCS1Padding */
        RSA_ECB_PKCS1("RSA/ECB/PKCS1Padding"), 
    
        /** 默认的 AES 加密形式:AES/ECB/PKCS5Padding */
        AES("AES"), 
  • SM2_SM4

        /**
         * 算法 EC
         */
        private static final String ALGORITHM_SM2 = "SM2";
        
        public static final String ALGORITHM_NAME = "SM4";

密钥替换 - 第一步:取得加密公钥

接口地址:POST /open/v2.3/keyExchange/{storageKey}

参数 阐明 参数示例
storageKey RESTful 门路参数,密钥存储 key 23ef1f9418e84cc884187e1720ac1529
exchangeKeyType 替换密钥类型,枚举值:RSA_AES、SM2_SM4 RSA_AES

密钥替换 - 第二步:取得替换密钥

接口地址:POST /open/v2.3/keyExchange/{storageKey}

参数 阐明 参数示例
storageKey RESTful 门路参数,密钥存储 key 23ef1f9418e84cc884187e1720ac1529
exchangeKeyType 替换密钥类型,枚举值:RSA_AES、SM2_SM4 RSA_AES
encryptedClientPublicKey 应用服务端公钥加密的客户端公钥(encryptBase64) SsowXMaZfQiec39 .. 略 n.. uv/DbVr6gslrjY3Q==

密钥替换 - 第三步:增加存储 key 别名

接口地址:POST /open/v2.3/keyExchange/{storageKey}/addAlias

参数 阐明 参数示例
storageKey RESTful 门路参数,密钥存储 key 23ef1f9418e84cc884187e1720ac1529
storageKeyAlias 存储别名 cbf55767c47e4d4e9feb90cfa2bdf5aa

配置

yue: 
  crypto:
    key-exchange:
      enabled: true # 默认 false,启用密钥替换
      key-exchange-storage-type: redis # 应用 redis 作为密钥替换存储类型

注解应用阐明

@RequestDecrypt申请解密注解:

  • 必须与 @RequestBody 注解一起应用
  • @RequestBody注解只反对应用 Body 传参,并映射为实体参数。
  • Content-Type=application/json;charset=UTF-8

        @RequestDecrypt
        @PostMapping("/decrypt")
        public Result<?> decrypt(@RequestBody UserIPO userIPO) {return R.success(userIPO);
        }

@ResponseEncrypt响应加密注解:

  • 必须与 @ResponseBody 注解一起应用,@RestController注解默认已集成@ResponseBody
  • 必须应用 Result 作为返回类型,并且加密的是 data 参数

        @ResponseEncrypt
        @GetMapping("/{encrypt}")
        public Result<?> encrypt(@PathVariable String encrypt) {return R.success(encrypt);
        }

珍藏一波以表反对吧(≧▽≦)/!

本文由博客群发一文多发等经营工具平台 OpenWrite 公布

退出移动版