• 主键加密组件


    组件编码 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 注解

    DTO主键加密示例

    Encrypt的 value 属性将作为加解密密钥的一部分,使用表名

    2.2 解密主键

    前端请求时,主键可能在url上,或者请求body里

    主键在url上

    一般查询接口,删除接口,主键都拼在url上,需要在controller层进行处理一下

    在参数前添加 @Encrypt 注解

    注意

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

    url注意事项2

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

    url注意事项

    使用一个对象接收get请求的参数 如果这个对象也包含了 主键参数 ,比如这个例子里的 RfxLineItem 里有 rfxHeaderId 属性

    此时 spring mvc 框架会帮你自动把 rfxHeaderId 映射到对象里,这时候也需要自动解密

    • DTO对象 参数 前添加 @EncryptDTO 注解

    url注意事项处理

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

    url注意事项处理2

    主键在请求body里

    一般情况新增,更新接口,都是提交 JSON 数据,主键在请求body里

    跟加密一样,只需在相应的实体对象上给 主键字段@Encrypt 注解

    解密与加密的注解是同一个,对于同一个业务对象,要保证 @Encrypt 注解的值一致

    三、加解密原理

    因为平台与前端交互的数据格式统一为 JSON ,所以核心是对json数据里的主键字段进行加解密

    3.1 加密算法

    Base64(AES(固定密钥,表名+业务主键id+用户id))

    3.2 加密,解密原理

    通过自定义jackson框架的 序列化反序列化 过滤器,针对主键id进行加密和解密