찾다
Javajava지도 시간Java에서 데이터 둔감화를 달성하기 위해 Jackson 직렬화를 사용하는 방법

    1. 배경

    프로젝트에서는 고객 휴대폰 번호, 신분증, 차량 번호판 번호 및 기타 정보와 같은 일부 민감한 정보를 직접 표시할 수 없습니다. 고객 개인 정보 보호. 감도 줄이기란 데이터의 일부를 감도 줄이기 기호(*)로 처리하는 것을 의미합니다.

    2. 목표

    • 서버가 데이터를 반환하면 Jackson 직렬화를 사용하여 데이터 둔감화를 완료하고 민감한 정보를 둔감하게 표시합니다.

    • 반복되는 개발 양을 줄이고 개발 효율성 향상

    • 통합되고 효과적인 둔감화 규칙 형성

    • 확장 가능하고 사용자 정의 가능한 개인화 서비스를 달성하기 위해 기본 둔감화 구현을 재정의하는 둔감화 방법을 기반으로 할 수 있음 of the scene

    3. 주요 구현

    3.1 Jackson을 기반으로 한 사용자 정의 둔감화 직렬화 구현

    StdSerializer: 모든 표준 직렬화기에서 사용하는 기본 클래스. 사용자 정의 직렬화 작성을 위한 기본 클래스입니다. 프로그램에서 사용하도록 권장됩니다. .

    ContextualSerializer: 는 Jackson이 제공하는 또 다른 직렬화 관련 인터페이스입니다. 해당 기능은 필드에서 알려진 상황별 정보를 통해 JsonSerializer를 사용자 정의하는 것입니다.

    package com.jd.ccmp.ctm.constraints.serializer;
    
    
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.BeanProperty;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.fasterxml.jackson.databind.ser.ContextualSerializer;
    import com.fasterxml.jackson.databind.ser.std.StdSerializer;
    import com.jd.ccmp.ctm.constraints.Symbol;
    import com.jd.ccmp.ctm.constraints.annotation.Desensitize;
    import com.jd.ccmp.ctm.constraints.desensitization.Desensitization;
    import com.jd.ccmp.ctm.constraints.desensitization.DesensitizationFactory;
    import com.jd.ccmp.ctm.constraints.desensitization.DefaultDesensitization;
    
    
    
    
    import java.io.IOException;
    
    
    
    
    /**
     * 脱敏序列化器
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 11:10
     */
    public class ObjectDesensitizeSerializer extends StdSerializer<Object> implements ContextualSerializer {
        private static final long serialVersionUID = -7868746622368564541L;
        private transient Desensitization<Object> desensitization;
        protected ObjectDesensitizeSerializer() {
            super(Object.class);
        }
        public Desensitization<Object> getDesensitization() {
            return desensitization;
        }
        public void setDesensitization(Desensitization<Object> desensitization) {
            this.desensitization = desensitization;
        }
        @Override
        public JsonSerializer<Object> createContextual(SerializerProvider prov, BeanProperty property) {
    //获取属性注解
            Desensitize annotation = property.getAnnotation(Desensitize.class);
            return createContextual(annotation.desensitization());
        }
        @SuppressWarnings("unchecked")
        public JsonSerializer<Object> createContextual(Class<? extends Desensitization<?>> clazz) {
            ObjectDesensitizeSerializer serializer = new ObjectDesensitizeSerializer();
            if (clazz != DefaultDesensitization.class) {
                serializer.setDesensitization((Desensitization<Object>) DesensitizationFactory.getDesensitization(clazz));
            }
            return serializer;
        }
        @Override
        public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            Desensitization<Object> objectDesensitization = getDesensitization();
            if (objectDesensitization != null) {
                try {
                    gen.writeObject(objectDesensitization.desensitize(value));
                } catch (Exception e) {
                    gen.writeObject(value);
                }
            } else if (value instanceof String) {
                gen.writeString(Symbol.getSymbol(((String) value).length(), Symbol.STAR));
            } else {
                gen.writeObject(value);
            }

    참고: createContextual은 필드 유형과 주석을 가져올 수 있습니다. 필드에 사용자 정의 주석이 있는 경우 주석의 값을 가져와 사용자 정의 직렬화 메서드를 생성하면 해당 값을 직렬화 메서드에서 얻을 수 있습니다. createContextual 메서드는 필드가 처음 직렬화될 때만 호출되므로(필드의 컨텍스트 정보는 런타임 중에 변경되지 않으므로) 성능 문제에 대해 걱정할 필요가 없습니다.

    3.2 Desensitizer 인터페이스 정의 및 공장 구현

    3.2.1 Desensitizer 인터페이스 정의

    package com.jd.ccmp.ctm.constraints.desensitization;
    
    
    /**
     * 脱敏器
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 10:56
     */
    public interface Desensitization<T> {
        /**
         * 脱敏实现
         *
         * @param target 脱敏对象
         * @return 脱敏返回结果
         */
        T desensitize(T target);
    }

    3.2.2 Desensitizer 공장 구현

    package com.jd.ccmp.ctm.constraints.desensitization;
    
    import java.util.HashMap;
    import java.util.Map;
    
    
    /**
     * 工厂方法
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 10:58
     */
    public class DesensitizationFactory {
        private DesensitizationFactory() {
        }
        private static final Map<Class<?>, Desensitization<?>> map = new HashMap<>();
    
    
    
    
        @SuppressWarnings("all")
        public static Desensitization<?> getDesensitization(Class<?> clazz) {
            if (clazz.isInterface()) {
                throw new UnsupportedOperationException("desensitization is interface, what is expected is an implementation class !");
            }
            return map.computeIfAbsent(clazz, key -> {
                try {
                    return (Desensitization<?>) clazz.newInstance();
                } catch (InstantiationException | IllegalAccessException e) {
                    throw new UnsupportedOperationException(e.getMessage(), e);
                }
            });

    3.3 일반적으로 사용되는 Desensitizer 구현

    3.3 .1 기본 desensit 구현 구현

    기본 구현을 기반으로 확장하여 개인화된 시나리오 구현 가능

    package com.jd.ccmp.ctm.constraints.desensitization;
    
    
    /**
     * 默认脱敏实现
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 11:01
     */
    public interface DefaultDesensitization extends Desensitization<String> {
    }

    3.3.2 휴대폰 번호 감도 줄이기

    휴대폰 번호 중간 4자리 감도 줄이기 구현

    package com.jd.ccmp.ctm.constraints.desensitization;
    import com.jd.ccmp.ctm.constraints.Symbol;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    /**
     * 手机号脱敏器,保留前3位和后4位
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 11:02
     */
    public class MobileNoDesensitization implements DefaultDesensitization {
        /**
         * 手机号正则
         */
        private static final Pattern DEFAULT_PATTERN = Pattern.compile("(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}");
    
    
    
    
        @Override
        public String desensitize(String target) {
            Matcher matcher = DEFAULT_PATTERN.matcher(target);
            while (matcher.find()) {
                String group = matcher.group();
                target = target.replace(group, group.substring(0, 3) + Symbol.getSymbol(4, Symbol.STAR) + group.substring(7, 11));
            }
            return target;

    3.4 주석 정의

    사용자 정의 주석 구현 @JacksonAnnotationsInside를 통해 사용 편의성 향상

    package com.jd.ccmp.ctm.constraints.annotation;
    import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
    import com.fasterxml.jackson.databind.annotation.JsonSerialize;
    import com.jd.ccmp.ctm.constraints.desensitization.Desensitization;
    import com.jd.ccmp.ctm.constraints.serializer.ObjectDesensitizeSerializer;
    import java.lang.annotation.*;
    
    
    /**
     * 脱敏注解
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 11:09
     */
    @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @JacksonAnnotationsInside
    @JsonSerialize(using = ObjectDesensitizeSerializer.class)
    @Documented
    public @interface Desensitize {
        /**
         * 对象脱敏器实现
         */
        @SuppressWarnings("all")
        Class<? extends Desensitization<?>> desensitization();

    3.4.1 기본 둔감화 주석

    package com.jd.ccmp.ctm.constraints.annotation;
    import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
    import com.jd.ccmp.ctm.constraints.desensitization.DefaultDesensitization;
    import java.lang.annotation.*;
    
    
    
    
    /**
     * 默认脱敏注解
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 11:14
     */
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @JacksonAnnotationsInside
    @Desensitize(desensitization = DefaultDesensitization.class)
    @Documented
    public @interface DefaultDesensitize {

    3.4.2 휴대전화 번호 둔감화 주석

    package com.jd.ccmp.ctm.constraints.annotation;
    import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
    import com.jd.ccmp.ctm.constraints.desensitization.MobileNoDesensitization;
    import java.lang.annotation.*;
    
    
    /**
     * 手机号脱敏
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 11:18
     */
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @JacksonAnnotationsInside
    @Desensitize(desensitization = MobileNoDesensitization.class)
    @Documented
    public @interface MobileNoDesensitize {
    }

    3.5 둔감화 기호 정의

    지원됨 * 또는 등의 둔감화 기호 지정 ^_^

    package com.jd.ccmp.ctm.constraints;
    import java.util.stream.Collectors;
    import java.util.stream.IntStream;
    
    
    /**
     * 脱敏符号
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 10:53
     */
    public class Symbol {
        /**
         * &#39;*&#39;脱敏符
         */
        public static final String STAR = "*";
        private Symbol() {}
        /**
         * 获取符号
         *
         * @param number 符号个数
         * @param symbol 符号
         */
        public static String getSymbol(int number, String symbol) {
            return IntStream.range(0, number).mapToObj(i -> symbol).collect(Collectors.joining());
        }

    4. 사용 예 및 실행 프로세스 분석

    Java에서 데이터 둔감화를 달성하기 위해 Jackson 직렬화를 사용하는 방법

    프로그램 클래스 다이어그램

    Java에서 데이터 둔감화를 달성하기 위해 Jackson 직렬화를 사용하는 방법

    **실행 프로세스 분석**

    1. JsonUtil.toJsonString()을 호출하여 직렬화를 시작합니다

    2. mobile 속성에서 @MobileNoDesensitize 주석을 식별합니다(위의 3.4.2)

    3. ObjectDesensitizeSerializer#createContextual(위의 3.1 및 3.2)을 호출하고 JsonSerializer

    를 반환합니다. 4. 휴대폰 번호 감도 줄이기를 호출하여 MobileNoDesensitization#desensitize를 구현합니다. (위 3.3.2)

    5. 둔감화된 직렬화 결과 {"mobile":"133****5678"}을 출력합니다.

    핵심을 찾는 것은 어렵지 않습니다. 실행 과정은 3단계인데 어떻게 됩니까? @MobileNoDesensitize와 ObjectDesensitizeSerializer가 연결되었나요?

    • 참조 링크를 정렬해 보세요: @MobileNoDesensitize -> @Desensitize -> ObjectDesensitizeSerializer

    • 그러나 ObjectDesensitizeSerializer 구현에서는 위의 링크 관계

    • 이것은 Jackson 메타 주석의 개념에 대해 언급해야 합니다

    //**Jackson元注解**
    //1.提到元注解这个词,大家会想到@Target、@Retention、@Documented、@Inherited
    //2.Jackson也以同样的思路设计了@JacksonAnnotationsInside
    
    
    /**
     * Meta-annotation (annotations used on other annotations)
     * used for indicating that instead of using target annotation
     * (annotation annotated with this annotation),
     * Jackson should use meta-annotations it has.
     * This can be useful in creating "combo-annotations" by having
     * a container annotation, which needs to be annotated with this
     * annotation as well as all annotations it &#39;contains&#39;.
     * 
     * @since 2.0
     */
    @Target({ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @JacksonAnnotation
    public @interface JacksonAnnotationsInside
    {
    }

    Jackson에게 메타 주석을 사용하도록 지시하는 것은 "콤보 주석"(결합 주석, 번들 주석) 메커니즘을 통해서입니다. - 대상 주석을 사용하는 대신 자신이 소유한 주석을 사용하여 사용자 정의 둔감화를 활성화하여 설계 목표를 달성합니다.

    위 내용은 Java에서 데이터 둔감화를 달성하기 위해 Jackson 직렬화를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명
    이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
    JVM은 Java의 'Write Once, Run Aloneeringly'(Wora) 기능에 어떻게 기여합니까?JVM은 Java의 'Write Once, Run Aloneeringly'(Wora) 기능에 어떻게 기여합니까?May 02, 2025 am 12:25 AM

    JVM은 바이트 코드 해석, 플랫폼 독립 API 및 동적 클래스 로딩을 통해 Java의 Wora 기능을 구현합니다. 1. 바이트 코드는 크로스 플랫폼 작동을 보장하기 위해 기계 코드로 해석됩니다. 2. 표준 API 추상 운영 체제 차이; 3. 클래스는 런타임에 동적으로로드되어 일관성을 보장합니다.

    최신 버전의 Java는 플랫폼 별 문제를 어떻게 해결합니까?최신 버전의 Java는 플랫폼 별 문제를 어떻게 해결합니까?May 02, 2025 am 12:18 AM

    JAVA의 최신 버전은 JVM 최적화, 표준 라이브러리 개선 및 타사 라이브러리 지원을 통해 플랫폼 별 문제를 효과적으로 해결합니다. 1) Java11의 ZGC와 같은 JVM 최적화는 가비지 수집 성능을 향상시킵니다. 2) Java9의 모듈 시스템과 같은 표준 라이브러리 개선은 플랫폼 관련 문제를 줄입니다. 3) 타사 라이브러리는 OpenCV와 같은 플랫폼 최적화 버전을 제공합니다.

    JVM이 수행 한 바이트 코드 검증 프로세스를 설명하십시오.JVM이 수행 한 바이트 코드 검증 프로세스를 설명하십시오.May 02, 2025 am 12:18 AM

    JVM의 바이트 코드 검증 프로세스에는 네 가지 주요 단계가 포함됩니다. 1) 클래스 파일 형식이 사양을 준수하는지 확인, 2) 바이트 코드 지침의 유효성과 정확성을 확인하고 3) 유형 안전을 보장하기 위해 데이터 흐름 분석을 수행하고 4) 검증의 철저한 성능 균형을 유지합니다. 이러한 단계를 통해 JVM은 안전하고 올바른 바이트 코드 만 실행되도록하여 프로그램의 무결성과 보안을 보호합니다.

    플랫폼 독립성은 Java 응용 프로그램의 배포를 어떻게 단순화합니까?플랫폼 독립성은 Java 응용 프로그램의 배포를 어떻게 단순화합니까?May 02, 2025 am 12:15 AM

    Java'splatforminccendenceallowsapplicationStorunonAnyAnyOperatingSystemwithajvm.1) SingleCodeBase : writeAndCompileOnceforAllPlatforms.2) EasyUpdates : UpdateByTeCodeForsimultiancodeporsimultiancomeDeployment.3) 시험 효율성 : westernoneplatformforunivor.4) Scalab

    Java의 플랫폼 Independence는 시간이 지남에 따라 어떻게 진화 했습니까?Java의 플랫폼 Independence는 시간이 지남에 따라 어떻게 진화 했습니까?May 02, 2025 am 12:12 AM

    Java의 플랫폼 Independence는 JVM, JIT 컴파일, 표준화, 제네릭, Lambda 표현 및 ProjectPanama와 같은 기술을 통해 지속적으로 향상됩니다. 1990 년대 이래 Java는 기본 JVM에서 고성능 현대 JVM으로 발전하여 다양한 플랫폼에서 코드의 일관성과 효율성을 보장했습니다.

    Java 응용 프로그램에서 플랫폼 별 문제를 완화하기위한 몇 가지 전략은 무엇입니까?Java 응용 프로그램에서 플랫폼 별 문제를 완화하기위한 몇 가지 전략은 무엇입니까?May 01, 2025 am 12:20 AM

    Java는 플랫폼 별 문제를 어떻게 완화합니까? Java는 JVM 및 표준 라이브러리를 통해 플랫폼 독립성을 구현합니다. 1) Bytecode 및 JVM을 사용하여 운영 체제 차이를 추상화합니다. 2) 표준 라이브러리는 Paths 클래스 처리 파일 경로 및 Charset 클래스 처리 문자 인코딩과 같은 크로스 플랫폼 API를 제공합니다. 3) 최적화 및 디버깅을 위해 실제 프로젝트에서 구성 파일 및 다중 플랫폼 테스트를 사용하십시오.

    Java의 플랫폼 독립성과 마이크로 서비스 아키텍처의 관계는 무엇입니까?Java의 플랫폼 독립성과 마이크로 서비스 아키텍처의 관계는 무엇입니까?May 01, 2025 am 12:16 AM

    java'splatformincendenceenhancesmicroservicesarchitectureDeploymentFlexibility, 일관성, 확장 성 및 포트 가능성

    Graalvm은 Java의 플랫폼 독립 목표와 어떤 관련이 있습니까?Graalvm은 Java의 플랫폼 독립 목표와 어떤 관련이 있습니까?May 01, 2025 am 12:14 AM

    Graalvm은 Java의 플랫폼 독립성을 세 가지 방식으로 향상시킵니다. 1. 교차 언어 상호 운용성, Java는 다른 언어와 원활하게 상호 작용할 수 있습니다. 2. 독립적 인 런타임 환경, Java 프로그램을 GraalvMnativeImage를 통해 로컬 실행 파일로 컴파일합니다. 3. 성능 최적화, Graal Compiler는 Java 프로그램의 성능과 일관성을 향상시키기 위해 효율적인 기계 코드를 생성합니다.

    See all articles

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    Video Face Swap

    Video Face Swap

    완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

    뜨거운 도구

    메모장++7.3.1

    메모장++7.3.1

    사용하기 쉬운 무료 코드 편집기

    SublimeText3 Mac 버전

    SublimeText3 Mac 버전

    신 수준의 코드 편집 소프트웨어(SublimeText3)

    SecList

    SecList

    SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

    SublimeText3 중국어 버전

    SublimeText3 중국어 버전

    중국어 버전, 사용하기 매우 쉽습니다.

    Dreamweaver Mac版

    Dreamweaver Mac版

    시각적 웹 개발 도구