专治各种数据脱敏-Jackson-fastjson-logback

学习思路

  1. 分析脱敏场景

  2. 基于Fastjson、Jackson、logback的各种实现

  3. 总结

  4. 文末有代码实现git地址、小星星

一、分析脱敏场景

生产数据,为了保护用户信息,防止用户信息泄露,我们通常需要对数据进行脱敏主要有(手机号、身份证、姓名等)

  1. 打印日志脱敏,日志中看到的信息不是完整的比如:183****0001

  2. 接口返回信息脱敏,比如用户手机号、银行卡号、身份证等

  3. 数据库脱敏存储

题外话:数据库存储目前用的比较多的是密码加密,其它的数据牵扯到查询,加密成本比较高,sharding-jdbc自带数据加密存储及查询,有兴趣的可以了解一下,我们本节主要讲解前两种

 

二、基于Fastjson、Jackson、logback的各种实现

1、Fastjson实现

实现思路:

  1. 自定义注解,可让用户自定义脱敏方式,用于实体类的属性

  2. 基于ValueFilter进行 属性注解拦截,并多value进行替换脱敏

  3. 使用json序列化对象是指定自定义序列化Filter

题外话:ValueFilter:对象值过滤器,将要序列化对象的值进行统一处理

 

代码实现:

首先自定义注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Desensitization {
​
  /**
   * 脱敏规则类型
   * @return
   */
  DesensitionType type();
​
  /**
   * 附加值, 自定义正则表达式等
   * @return
   */
  String[] attach() default "";
​
}

 

解释:

  1. 脱敏规则类型:主要定义了一些常用的类型(手机号、身份证等)

  2. 自定义正则表达式,如果常用的不能满足时可自定义

看一下脱敏规则类型

public enum DesensitionType {
  /**
   * 手机号脱敏
   * "(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}"
   * "(\\d{3})\\d{4}(\\d{4})"
   */
  PHONE("mobile", "11位手机号", "(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{4}(\\d{4}}", "$1****$2"),
  IDENTITYNO("identityNo", "15或者18身份证号", "(\\w{4})\\w{7,10}(\\w{4})", "$1****$2"),
  BANKCARDNO("bankCardNo", "银行卡号", "(\\d{4})\\d*(\\d{4})", "$1****$2"),
  REALNAME("realname","真实姓名Json类型","(\"realname\":)(\"[\u4E00-\u9FA5]{1})[\u4E00-\u9FA5]{1,}(\")","$1$2**$3"),
  REALNAME2("realname","真实姓名toString类型","(realname=)([\u4E00-\u9FA5]{1})[\u4E00-\u9FA5]{1,}","$1$2**"),
  CUSTOM("custom", "自定义正则处理", ""),
  TRUNCATE("truncate", "字符串截取处理", ""),
  ;
  String type;
  String describe;
  String[] regular;
  DesensitionType(String type, String describe, String... regular) {
    this.type = type;
    this.describe = describe;
    this.regular = regular;
  }

 

这里主要注意一下第三个参数:是一个数组,通常0位:要脱敏数据的正则匹配,1位:要脱敏成的格式

 

然后在我们的需要脱敏的对象字段上加上该注解

@Datapublic class UserDTO implements Serializable {  @Desensitization(type=DesensitionType.IDENTITYNO)  private String identityNo;  private String name;  private String realname;}

接下来编写我们的自定义值过滤器,实现ValueFilter,实现方法process()

@Log4j2
public class FastjsonDesensitizeFilter implements ValueFilter,DesensitizeService {
  @Override
  public Object process(Object object, String name, Object value) {
    if (null == value || !(value instanceof String) || ((String) value).length() == 0) {
      return value;
    }
    try {
      Field field = object.getClass().getDeclaredField(name);
      Desensitization desensitization;
      if (String.class != field.getType() || (desensitization = field.getAnnotation(Desensitization.class)) == null) {
        return value;
      }
      ;
      DesensitionType type = desensitization.type();
      List<String> regular=this.desensitize(type,desensitization);
      if (regular.size() > 1) {
        String match = regular.get(0);
        String result = regular.get(1);
        if (null != match && result != null && match.length() > 0) {
          return ((String) value).replaceAll(match, result);
        }
      }
    } catch (Exception e) {
      log.warn("FastJsonDesensitizeFilter the class {} has no field {}", object.getClass(), name);
    }
    return value;
  }
}

 

解释:

  1. 这里目前只支持String类型的value,大家可以根据需要自定义

  2. 获取属性上的注解,根据属性得到相应的脱敏规则类型

  3. 按照规则类型进行value替换  

然后只要我们在使用fastjson进行序列化的时候指定我们的自定义过滤器即可

public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
      Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
    log.info("requestUrl 【{}】 request body 【{}】",request.getURI(),JSONObject.toJSONString(body,new FastjsonDesensitizeFilter()));
    return body;
  }

 

打印出来就是这样

requestUrl 【http://localhost:8080/idNo】 request body 【{"code":"000000","data":{"identityNo":"1111****1111","name":"dsf","realname":"张**"},"message":"SUCCESS"}】

2、基于jackson实现数据脱敏

思路跟用fastjson基本一样,只是实现的类不同而已

public class JacksonDesensitize extends JsonSerializer<String> implements ContextualSerializer,DesensitizeService{
  private DesensitionType type;
  @Override
  public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
      throws IOException {
    if (type!=null){
      try {
        List<String> regular=this.desensitize(type,null);
        if (regular.size() > 1) {
          String match = regular.get(0);
          String result = regular.get(1);
          if (null != match && result != null && match.length() > 0) {
            jsonGenerator.writeString ( value.replaceAll(match, result));
          }
        }
      } catch (Exception e) {
        log.warn("JacksonDesensitize has no field {}",  value);
      }
    }
  }
​
  @Override
  public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty)
      throws JsonMappingException {
    type = beanProperty.getAnnotation(Desensitization.class).type();
    return this;
  }
}

 

解释:

  1. 获取对象属性上的注解,根据属性得到相应的脱敏规则类型

  2. 按照规则类型进行value替换  

题外话:这里主要牵扯到要继承JsonSerializer重写serialize()方法实现对象序列化,实现ContextualSerializer接口,实现方法,这个主要是拿到属性上的注解

接下来引用我们的自定义序列化器即可,直接在自定义注解上引用即可

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@JsonSerialize(using = JacksonDesensitize.class)@JacksonAnnotationsInsidepublic @interface Desensitization {  /**   * 脱敏规则类型   * @return   */  DesensitionType type();  /**   * 附加值, 自定义正则表达式等   * @return   */  String[] attach() default "";}

解释:

  1. 这里主要看@JsonSerialize(using=JacksonDesensitize.class)就是让json序列化时用我们自定义的

  2. @JacksonAnnotationsInside这个是注解组合出现时用的

我们现在的项目基本都是前后端分离,controller返回的时候一般都是ResponseBody的,正好我们springMVC后台是默认使用Jackson作为序列化的,所以这时候就可以直接使用

返回就是这样的

{    "code": "000000",    "message": "SUCCESS",    "data": {        "identityNo": "1111****1111",        "name": "dsf",        "realname": "张三"    }}

3、基于logback进行全局日志脱敏

思路

  1. 我们先定义需要脱敏的属性名,就是你真正要打印到日志的属性名字

  2. 然后继承logback的MessageConverter重写convert方法

  3. 通过正则进行身份证、姓名、手机号的匹配

  4. 匹配成功后按规则替换

public class LogDesensitizeConverter  extends MessageConverter {
  /**
   * 日志脱敏开关
   */
  private static Boolean converterCanRun = Boolean.TRUE;
  /**
   * 日志脱敏关键字
   */
  @Override
  public String convert(ILoggingEvent event) {
    // 获取原始日志
    String oriLogMsg = event.getFormattedMessage();
    if (!converterCanRun){
      return oriLogMsg;
    }
    // 获取脱敏后的日志
    DesensitionType[] values = DesensitionType.values();
    for (DesensitionType value : values) {
      if (value.getRegular()!=null && value.getRegular().length>0 && oriLogMsg.contains(value.getType())){
        Matcher matcher = Pattern.compile(value.getRegular()[0]).matcher(oriLogMsg);
        oriLogMsg = matcher.replaceAll(value.getRegular()[1]);
      }
    }
    return oriLogMsg;
  }
}

然后将我们编写完的Converter添加到logback.xml文件引用即可

之后接口用了,日志文件里时这样的

三、总结

  1. SpringMVC默认使用Jackson作为对象序列化,如果想要使用fastjson需要单独配置,然后指定我们的自定义序列化器就可以了

  2. 如果单纯的只用fastjson打印日志那么建议在拦截器,或者像本文代码中实现ResponseBodyAdvice去集中打印,不然还要每次都加我们的自定义序列化器

  3. 我们使用Jackson和fastjson时使用了自定义注解,当然也可以根据自己的业务提前定义属性值,像logback的方式一样实现也可

  4. 复杂的正则很耗cpu但我们的非常简单,并且都有提前过滤

 

四、现码的代码

git地址:https://gitee.com/carpentor/spring-cloud-example.git​

代码里包含了很多,本文主要看desensitize项目

 

帮忙关注公众号,更多好文

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 父依赖:Spring Boot 3.3.1 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.3.1</version> <relativePath/> </parent> <!-- 项目基本信息 --> <groupId>com.example</groupId> <artifactId>main</artifactId> <version>0.0.1</version> <name>main</name> <description>为Spring Cloud Alibaba升级铺垫的主服务</description> <!-- 版本管理(统一控制依赖版本,避免冲突) --> <properties> <java.version>17</java.version> <encoding>UTF-8</encoding> <project.build.sourceEncoding>${encoding}</project.build.sourceEncoding> <project.reporting.outputEncoding>${encoding}</project.reporting.outputEncoding> <maven.compiler.encoding>${encoding}</maven.compiler.encoding> <!-- Spring Cloud Alibaba 版本(适配Spring Boot 3.3.x) --> <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version> <!-- Spring Cloud 版本(与Alibaba配套) --> <spring-cloud.version>2023.0.2</spring-cloud.version> <!-- 第三方工具版本 --> <mybatis-plus.version>3.5.7</mybatis-plus.version> <fastjson2.version>2.0.52</fastjson2.version> <modelmapper.version>3.2.1</modelmapper.version> <jjwt.version>0.11.5</jjwt.version> <redisson.version>3.50.0</redisson.version> <hutool.version>5.8.32</hutool.version> <!-- 统一hutool版本 --> <poi.version>5.4.0</poi.version> <druid.version>1.2.13</druid.version> <minio.version>8.5.12</minio.version> <taos-jdbcdriver.version>3.5.3</taos-jdbcdriver.version> <xxl-job.version>2.4.1</xxl-job.version> <springdoc.version>2.1.0</springdoc.version> <!-- <powerjob.version>5.1.1</powerjob.version>--> <californium.version>3.5.0</californium.version> <wechatpay-sdk.version>0.2.17</wechatpay-sdk.version> <alipay-sdk.version>4.34.0.ALL</alipay-sdk.version> <volc-sdk.version>LATEST</volc-sdk.version> </properties> <!-- 依赖管理(控制Spring Cloud Alibaba及相关组件版本) --> <dependencyManagement> <dependencies> <!-- Spring Cloud Alibaba 核心依赖管理 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- Spring Cloud 核心依赖管理 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- gRPC 核心依赖 --> <!-- <dependency>--> <!-- <groupId>net.devh</groupId>--> <!-- <artifactId>grpc-spring-boot-starter</artifactId>--> <!-- <version>3.1.0.RELEASE</version>--> <!-- </dependency>--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!-- 在 dependencies 部分添加 --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.70</version> </dependency> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>9.0</version> </dependency> <!-- 一、Spring Boot 核心 Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-annotations-api</artifactId> </exclusion> </exclusions> </dependency> <!-- 新增:强制指定 javax.annotation-api 版本,解决 Resource.lookup() 方法缺失问题 --> <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> <scope>provided</scope> <!-- provided 表示由容器提供,但强制声明版本避免冲突 --> </dependency> <!-- WebClient 依赖(响应式HTTP客户端) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <!-- 服务监控,Alibaba生态必备 --> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 二、Spring Cloud Alibaba 核心组件(为升级铺垫) --> <!-- 服务注册与发现(Nacos) --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 声明式服务调用(OpenFeign) --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- 熔断限流(Sentinel,已存在,保留) --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!-- 消息队列(RocketMQ,与Alibaba生态兼容) --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-stream-rocketmq</artifactId> <!-- 替换原生rocketmq-starter,适配Alibaba --> </dependency> <!-- 三、安全与认证 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> <!-- JWT工具 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>${jjwt.version}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>${jjwt.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>${jjwt.version}</version> <scope>runtime</scope> </dependency> <!-- 四、数据访问 --> <!-- MySQL驱动 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <!-- MongoDB --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <!-- Redis(Redisson作为客户端,已排除原生Redis starter避免冲突) --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>${redisson.version}</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </exclusion> </exclusions> </dependency> <!-- MyBatis-Plus(适配Spring Boot 3) --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>${mybatis-plus.version}</version> </dependency> <!-- 数据库连接池(Druid) --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> <!-- 五、消息与通信 --> <!-- WebSocket --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <!-- Kafka(如需保留,与RocketMQ并存需注意配置隔离) --> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka-test</artifactId> <scope>test</scope> </dependency> <!-- CoAP协议 --> <dependency> <groupId>org.eclipse.californium</groupId> <artifactId>californium-core</artifactId> <version>${californium.version}</version> </dependency> <!-- 六、工具类 --> <!-- JSON处理(FastJSON2) --> <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>${fastjson2.version}</version> </dependency> <!-- 对象转换(ModelMapper) --> <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmapper</artifactId> <version>${modelmapper.version}</version> </dependency> <!-- Hutool工具集(已包含captcha,移除单独的hutool-captcha) --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency> <!-- Excel处理(POI) --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>${poi.version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${poi.version}</version> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- 七、业务组件 --> <!-- 文件存储(MinIO) --> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>${minio.version}</version> </dependency> <!-- 时序数据库(TAOS) --> <dependency> <groupId>com.taosdata.jdbc</groupId> <artifactId>taos-jdbcdriver</artifactId> <version>${taos-jdbcdriver.version}</version> </dependency> <!-- 任务调度(XXL-Job) --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>${xxl-job.version}</version> </dependency> <!-- 分布式任务调度(PowerJob) --> <!-- <dependency>--> <!-- <groupId>com.github.kfcfans</groupId>--> <!-- <artifactId>powerjob-client</artifactId>--> <!-- <version>${powerjob.version}</version>--> <!-- </dependency>--> <!-- 八、支付相关 --> <dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-java</artifactId> <version>${wechatpay-sdk.version}</version> </dependency> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>${alipay-sdk.version}</version> </dependency> <!-- 九、API文档(Swagger) --> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>${springdoc.version}</version> </dependency> <!--activiti--> <!-- <dependency>--> <!-- <groupId>org.activiti</groupId>--> <!-- <artifactId>activiti-spring-boot-starter</artifactId>--> <!-- <version>7.1.0.M4</version>--> <!-- </dependency>--> <!-- 十、火山引擎SDK --> <dependency> <groupId>com.volcengine</groupId> <artifactId>volcengine-java-sdk-ark-runtime</artifactId> <version>${volc-sdk.version}</version> </dependency> <dependency> <groupId>com.volcengine</groupId> <artifactId>volc-sdk-java</artifactId> <version>${volc-sdk.version}</version> </dependency> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.12</version> </dependency> <dependency> <groupId>org.bytedeco</groupId> <artifactId>ffmpeg-platform</artifactId> <version>7.1.1-1.5.12</version> </dependency> </dependencies> <!-- 仓库配置(优先使用阿里云仓库加速) --> <repositories> <repository> <id>aliyun</id> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> <snapshots> <enabled>false</enabled> <!-- 关闭快照版本下载 --> </snapshots> </repository> <!-- Spring Cloud Alibaba 专属仓库(确保依赖下载) --> <repository> <id>spring-cloud-alibaba</id> <name>Spring Cloud Alibaba Repository</name> <url>https://maven.aliyun.com/repository/spring</url> </repository> </repositories> <!-- 构建配置 --> <build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.7.0</version> </extension> </extensions> <plugins> <!-- <plugin>--> <!-- <groupId>org.xolstice.maven.plugins</groupId>--> <!-- <artifactId>protobuf-maven-plugin</artifactId>--> <!-- <version>0.6.1</version>--> <!-- <configuration>--> <!-- <protocArtifact>com.google.protobuf:protoc:3.21.7:exe:${os.detected.classifier}</protocArtifact>--> <!-- <pluginId>grpc-java</pluginId>--> <!-- <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.51.1:exe:${os.detected.classifier}</pluginArtifact>--> <!-- <!– 生成代码的输出目录 –>--> <!-- <outputDirectory>${project.build.directory}/generated-sources/protobuf</outputDirectory>--> <!-- <clearOutputDirectory>false</clearOutputDirectory>--> <!-- </configuration>--> <!-- <executions>--> <!-- <execution>--> <!-- <goals>--> <!-- <goal>compile</goal> <!– 编译protobuf文件生成消息类 –>--> <!-- <goal>compile-custom</goal> <!– 编译生成gRPC服务类 –>--> <!-- </goals>--> <!-- </execution>--> <!-- </executions>--> <!-- </plugin>--> <!-- Spring Boot 打包插件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> <!-- 多环境配置 --> <profiles> <profile> <id>dev</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <spring-boot.run.profiles>dev</spring-boot.run.profiles> </properties> </profile> <profile> <id>prod</id> <properties> <spring-boot.run.profiles>prod</spring-boot.run.profiles> </properties> </profile> </profiles> </configuration> </plugin> <!-- 编译插件(指定Java版本) --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${encoding}</encoding> </configuration> </plugin> </plugins> <!-- 资源文件配置 --> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> <include>**/*.yml</include> <!-- 补充yml文件支持 --> </includes> <filtering>false</filtering> <!-- 不启用过滤 --> </resource> <!-- 多环境配置文件过滤 --> <resource> <directory>src/main/resources</directory> <includes> <include>application.properties</include> <include>application-${profiles.active}.properties</include> <include>application-${profiles.active}.yml</include> </includes> <filtering>true</filtering> <!-- 启用变量替换 --> </resource> </resources> </build> <!-- 多环境配置 --> <profiles> <profile> <id>dev</id> <properties> <profiles.active>dev</profiles.active> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>prod</id> <properties> <profiles.active>prod</profiles.active> </properties> </profile> </profiles> </project> 用我的pom帮我实现满足国标(GB/T 35273-2020)要求 核心满足 3 点即可: 加密算法合规:优先使用 AES-256、RSA-2048 及以上、SM4 等国标认可的算法。 密钥管理合规:密钥需与明文数据分离存储,定期轮换,避免密钥泄露。 全流程防护:除了存储加密,传输(SSL/TLS)、使用(脱敏展示)环节也需符合国标要求,形成闭环。
最新发布
11-07
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值