데이터 둔감화, 국가 기밀 암호화 및 암호 해독(sm4)을 달성하기 위한 사용자 지정 주석

데이터 둔감화, 국가 기밀 암호화 및 암호 해독(sm4)을 달성하기 위한 사용자 정의 주석은
종종 실제 개발에서 일부 정보가 사용자에게 표시될 수 없고 주소, 전화번호, 휴대전화번호, 신분증 등 1): 비즈니스 코드 둔감화: 이름에서 알 수 있듯이 데이터를 가져온 후 둔감화해야 하는 필드를 일련의 둔감화 규칙에 입력하고 원하는 형식으로 대체합니다
. 2): 사용자 지정 주석 + aop aspect의 방법은 필드 둔감화의 목적을 완성하는 데 사용됩니다. 3): 사용자 지정 주석 + 직렬화를 통해 데이터를 둔감하게 만듭니다. 그 중 효율성이 가장 느린 코드 비즈니스 코드 방식과 최적의 방식은 커스텀 애노테이션 방식으로 코드 양을 줄이고 업무 효율성을 높인다. 커스텀 어노테이션 + 직렬화 방식인 오늘 세 번째 방식을 기록합니다. 먼저 둔감화가 필요한 전략을 정의합니다.






/**
 * @description: 脱敏策略
 * @author: 
 * @date: 2023/6/18 19:45
 * @Version: 1.0
 */
public enum DesensitizationEnum {

    /**
     * 名称脱敏
     */
    USERNAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2"))
    ,
    /**
     * 手机号脱敏
     */
    MOBILE_PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"))
    ,
    /**
     *地址脱敏
     */
    ADDRESS(s -> s.replaceAll("(\\S{3})\\S{2}(\\S*)\\S{2}", "$1****$2****"))
    ;

    /**
     * 成员变量  是一个接口类型
     */
    private Function<String, String> function;

    DesensitizationEnum(Function<String, String> function) {
        this.function = function;
    }

    public Function<String, String> function() {
        return this.function;
    }
}

그런 다음 주석을 맞춤설정합니다.

import com.chaozhou.test01.dingShiRenWu.Annontion.Aspect.DesensitizationEnum;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @description:
 * @author:
 * @date: 2023/6/18 17:23
 * @Version: 1.0
 */

@Target({ElementType.FIELD}) //表明作用在字段上
@Retention(RetentionPolicy.RUNTIME) //什么情况下生效
@JacksonAnnotationsInside //标明序列化
@JsonSerialize(using = DesensitizationDataSerialize.class)
public @interface DesensitizationData {

    DesensitizationEnum function();
}

그런 다음 직렬 변환기를 사용자 정의하십시오.

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import lombok.NoArgsConstructor;

import java.io.IOException;
import java.util.Objects;

/**
 * @description: 数据脱敏序列化器
 * @author: 
 * @date: 2023/6/18 19:17
 * @Version: 1.0
 */
@NoArgsConstructor
public class DesensitizationDataSerialize extends JsonSerializer<String> implements ContextualSerializer {

    private DesensitizationEnum fuincation;

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        DesensitizationData annotation = beanProperty.getAnnotation(DesensitizationData.class);
        if(Objects.nonNull(annotation) && Objects.equals(beanProperty.getType().getRawClass(),String.class)){
            this.fuincation = annotation.function();
            return this;
        }
        return serializerProvider.findValueSerializer(beanProperty.getType(),beanProperty);
    }

    @Override
    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(fuincation.function().apply(s));
    }

}

이러한 사용자 지정 둔감화 주석이 완료됩니다.
사용 방법:
반환 매개변수에서 둔감화해야 하는 필드에 응답 주석만 추가하면 됩니다.

public class User implements Serializable {

    @TableId("id")
    private Integer id;

    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @ApiModelProperty(value = "出生年月")
    private Date birthday;

    @ApiModelProperty(value = "性别")
    private String gender;

    @ApiModelProperty(value = "姓名")
    private String username;

    @ApiModelProperty(value = "密码")
    private String password;

    @ApiModelProperty(value = "备注")
    private String remark;

    @ApiModelProperty(value = "状态")
    private String station;

    @ApiModelProperty(value = "联系电话")
    //手机号脱敏
    @DesensitizationData(function = DesensitizationEnum.MOBILE_PHONE)
    private String telephone;

}

결과
여기에 이미지 설명 삽입
휴대폰 번호가 성공적으로 둔감화되었으며 이 방법은 단일 및 다중 데이터를 모두 지원합니다.

국가 기밀 암호화 및 복호화
에 필요한 종속성은 hutool에 통합된 프레임워크로 직접 구현 가능

<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.16</version>
        </dependency>
        <!--以下依赖不加亲测也可以实现-->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.60</version>
        </dependency>

위의 방법에서 전략에 암호화 및 복호화 규칙을 추가한
여기에 이미지 설명 삽입
다음 암호화 또는 복호화해야 하는 필드에 주석을 추가하고 올바른 전략에 주석을 달아
여기에 이미지 설명 삽입
위의 직렬 변환기를 수정하여 내가 복호화해야 하는 필드 값을 방지합니다.
여기에 이미지 설명 삽입
목록 필드가 암호화되기 전에 비어 있음 "Null 입력 버퍼" 오류가 보고됨
여기에 이미지 설명 삽입

목록이 암호화된 후
여기에 이미지 설명 삽입

도구가 잘 준비되어 있고 코드 효율성이 훨씬 높습니다.

Acho que você gosta

Origin blog.csdn.net/weixin_51114236/article/details/131276402
Recomendado
Clasificación