# shield **Repository Path**: open-byte/shield ## Basic Information - **Project Name**: shield - **Description**: Shield是一个基于SpringBoot 2.x的配置脱敏框架(SpringBoot 3.x正在适配中),内置了AES、DES3、SM4等多种加密算法(支持自定义的脱敏器算法),提供监听器功能,已支持详情输出、风险提示等功能,提供了丰富的拓展点。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2024-06-12 - **Last Updated**: 2024-06-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # shield star fork ![Shield](https://gitee.com/xu_zhibin/shield/raw/master/docs/shield.png) #### 1.框架介绍 Shield是一个基于SpringBoot 2.x的配置脱敏框架(SpringBoot 3.x正在适配中),内置了AES、DES3、SM4等多种加密算法(支持自定义的脱敏器算法),提供监听器功能,已支持详情输出、风险提示等功能,提供了丰富的拓展点。 #### 2.环境要求 1. JDK版本:JDK8+ 2. Maven版本:3.6.2+ 3. SpringBoot版本:2.x #### 3.安装教程 支持Maven依赖安装,如果中央仓库(后续会上传)没有,则需要打包安装在本地仓库(版本号为最新版本号): ~~~xml com.gitee.pristine shield-spring-boot-starter 1.1.6 ~~~ #### 4.内置加密算法 | 算法 | 填充模式 | 密钥长度(字节) | 安全性 | 是否默认 | | ---- | ----------------------- | -------------- | ------ | -------- | | AES | AES/CBC/PKCS5Padding | 16 / 24 / 32 | 很高 | 是 | | DES3 | DESede/CBC/PKCS5Padding | 24 / 32 | 高 | 否 | | IDEA | IDEA/ECB/PKCS5Padding | > 0 | 高 | 否 | | PBE | | > 0 | 一般 | 否 | | RC4 | | > 0 | 一般 | 否 | | SM4 | SM4/ECB/PKCS5Padding | 16 | 高 | 否 | #### 5.支持的属性读取方式 | | 获取配置方式 | 示例 | | ---- | ---------------------------------------------- | ------------------------------------------ | | 1 | @Component + @ConfigurationProperties | com.gitee.pristine.sample.demo.DemoConfig1 | | 2 | @Component + @Value | com.gitee.pristine.sample.demo.DemoConfig2 | | 3 | @PropertySource 读取 自定义配置文件.properties | com.gitee.pristine.sample.demo.DemoConfig3 | | 4 | 从ConfigurableEnvironment中getProperty()获取 | | #### 6.使用说明 1. 添加 shield-spring-boot-starter 依赖 2. 配置加密密钥,支持多种方式 - 配置文件设置(不建议生产环境使用,可在开发时使用方便调试) ~~~yaml # shield 示例配置 shield: # 秘钥值 secret: 'ABCDEFGH12345678' ~~~ - 启动时候,添加启动参数(建议) ~~~shell script java -jar project.jar -Dshield.secret='xxxxx' ~~~ - 项目外配置密钥文件,支持properties格式,启动成功后安全移除该文件即可或开启读取密钥后自动删除(建议) ~~~yaml # shield 示例配置 shield: # 密钥文件来源 secret-origin: external_conf_file # 密钥文件路径,当前 secret-origin 配置为 external_conf_file 时该配置方才有效,请确保该文件路径可以正常访问 external-secret-file: 'L:\\secret.sed' # 是否在读取完密钥文件后删除该文件,默认:不删除 delete-external-secret-file-after-read: false ~~~ 3. 对需要脱敏的属性值,生成加密后的值 - 手动初始化来获取(推荐使用) ~~~java public class EncryptData { /** * 生成所需要的加密数据,放入配置文件中 * @param args 参数 */ public static void main(String[] args) { // 创建脱敏器,可以根据不同的算法生成 PropertyDesensitiser desensitiser = DesensitiserFactory.delegate(ShieldAlgorithm.AES); // 设置初始化参数(必须进行初始化) String secret = "ABCDEFGH12345678"; String charset = "UTF-8"; ConfigParam configParam = new ConfigParam(secret, charset); desensitiser.setConfigParam(configParam); // 检测密钥是否合法(可选) desensitiser.checkSecret(secret); // 加密数据 System.out.println(desensitiser.encode("demo1 param value")); System.out.println(desensitiser.encode("demo2 param value")); System.out.println(desensitiser.encode("demo3 param value")); } } ~~~ - 通过Spring自动注入(使用这种方式的时候,要注意如果改变密钥或算法,则项目中原来已配置的加密后的数据将解密失败异常, 建议是清理已配置加密的属性值) ~~~java @SpringBootTest class ShieldSpringBootSampleApplicationTests { @Resource PropertyDesensitiser propertyDesensitiser; @Test void contextLoads() { System.out.println(propertyDesensitiser.encode("demo1 param value")); System.out.println(propertyDesensitiser.encode("demo2 param value")); System.out.println(propertyDesensitiser.encode("demo3 param value")); } } ~~~ 4. 对需要脱敏的属性值,添加加密标识 ~~~yaml # 参数脱敏配置 demo1: param: 'SED[s2onk7fwhLyLtzw4xlBMVdqNjLCqG36R9SZoroO3In8]' demo2: param: 'SED[IsCk-O-Ey9lo_JvOp5jqGfmPp-ZEXJNhC5m7nGXuRLI]' ~~~ #### 7.完整示例配置 ~~~yaml # shield 示例配置 shield: # 脱敏器算法 algorithm: aes # 秘钥值 secret: 'ABCDEFGH123' # 密钥文件来源 secret-origin: external_conf_file # 密钥文件路径,当前 secret-origin 配置为 external_conf_file 时该配置方才有效,请确保该文件路径可以正常访问 external-secret-file: 'L:\\secret.sed' # 是否在读取完密钥文件后删除该文件 delete-external-secret-file-after-read: false # 开启风险提示功能 enable-risking: true # 风险提示关键词,如果 enable-risking=true,则该项必须进行配置 risking-keywords: 'password,secret,pwd' # 开启输出解密详情 enable-details: true # 加密标识前缀和后缀 prefix: 'SED[' suffix: ']' ~~~ #### 8.框架拓展 - 支持注册自定义的脱敏器,继承 `AbstractPropertyDesensitiser` 抽象类或实现 `PropertyDesensitiser` 接口 - 支持添加自定义监听器,实现 `PropertyListener` 接口 - onEachPropertyReadEvent(PropertyEvent e) :每次读取一个配置属性值时候触发 - afterAllPropertyReadEvent() :读取完全部配置属性值时触发,只在最后触发一次 - 支持添加自定义转换器,实现 `PropertyConverter` 接口 ~~~java /** * Shield提供拓展配置 * @author xzb */ @Configuration public class DemoShieldConfig extends ShieldConfiguration { @Override public void config(ExpandPoint expandPoint) { // 注册自定义属性脱敏器, // 一旦注册了自定义属性脱敏器,则本脱敏器将会直接生效直接替换配置的脱敏器 // 也就是说,shield.algorithm 配置项将会失效 expandPoint.registerDesensitiser(new DemoDesensitiser()); // 添加自定义的属性转换器 expandPoint.addConverter(new DemoPropertyConverter()); // 添加自定义属性解析监听器 expandPoint.addListener(new DemoPropertyListener()); // 设置风险提示关键词,以逗号隔开,默认值 ‘password,secret’,多种配置的keywords则会进行合并 expandPoint.setRiskingKeywords("demo_password,demo_secret"); } } ~~~ #### 9.参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request 5. 如果您对项目有什么建议欢迎您留言