主键加密组件
组件编码
hzero-starter-keyencrypt
一、简介
1.1 概述
本文介绍的组件是通过后端自动加解密 主键id ,混淆我们的id,保护我们的主键信息,提升系统安全性。
该组件只需要改动少量后端代码,前端是无感的。
1.2 组件坐标
<dependency>
<groupId>org.hzero.starter</groupId>
<artifactId>hzero-starter-keyencrypt</artifactId>
<version>${hzero.starter.veresion}</version>
</dependency>
1.3 效果展示
-
加密前

-
加密后

二、使用方式
2.1 加密主键
我们的主键规范都是数值自增主键,加密后将变为字符串(对于字符串主键,其实也是支持的)
对于需要返回 主键字段 的接口,需要对主键进行加密,一般是根据非主键查询的接口,比如列表查询

只需在返回前端的实体类上给 主键字段 添加 @Encrypt 注解

Encrypt的
value属性将作为加解密密钥的一部分,使用表名
2.2 解密主键
前端请求时,主键可能在url上,或者请求body里
主键在url上
一般查询接口,删除接口,主键都拼在url上,需要在controller层进行处理一下
在参数前添加 @Encrypt 注解
-
主键在请求路径上
比如: /v1/{organizationId}/notices/xxxxxx

-
主键拼在url后面
比如: /v2/queryTest?id=xxxxx

注意
如果请求是这样: /v1/{organizationId}/rfx/inquiry/detail?rfxHeaderId=xxxxx

或者是 /v1/{organizationId}/rfx/{rfxHeaderId}/items?xxx=xxxx

使用一个对象接收get请求的参数
如果这个对象也包含了 主键参数 ,比如这个例子里的 RfxLineItem 里有 rfxHeaderId 属性
此时 spring mvc 框架会帮你自动把 rfxHeaderId 映射到对象里,这时候也需要自动解密
- 在
DTO对象参数 前添加@EncryptDTO注解

- 在被加密的主键字段上加
@Encrypt

主键在请求body里
一般情况新增,更新接口,都是提交 JSON 数据,主键在请求body里
跟加密一样,只需在相应的实体对象上给 主键字段 加 @Encrypt 注解
解密与加密的注解是同一个,对于同一个业务对象,要保证
@Encrypt注解的值一致
三、加解密原理
因为平台与前端交互的数据格式统一为 JSON ,所以核心是对json数据里的主键字段进行加解密
3.1 加密算法
Base64(AES(固定密钥,表名+业务主键id+用户id))
3.2 加密,解密原理
通过自定义jackson框架的
序列化和反序列化过滤器,针对主键id进行加密和解密