主键加密组件
组件编码
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进行加密和解密