首页 > 其他分享 >数据脱敏

数据脱敏

时间:2023-03-19 12:55:12浏览次数:42  
标签:return String idcard public 数据 email 脱敏

基于SpringBoot 实现数据脱敏

0、本文参考的链接

1、jackson
2、数据脱敏

1、实现方法

1、最简单的的,项目中引入Hutool工具包,调用其中的方法即可。【个人觉得不太好】
2、本文采用jackson去实现,jackson的简单学习 可以参考jackson

2、项目依赖:SpringBoot-Web 、Apache.common、lombok

PS: Spring默认的序列化框架就是 jackson,所以不需要单独引入

点击查看代码
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.12.0</version>
</dependency>
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>

3、定义脱敏枚举类

点击查看代码
/**
 * 数据脱敏类型
 */
public enum SensitiveEnum {

    /**
     * 身份证号码
     */
    ID_CARD,
    /**
     * 电子邮件
     */
    EMAIL,

    /**
     * 手机号码
     */
    MOBILE_PHONE;

}

4、不同类型字段脱敏处理

点击查看代码
public class SensitiveUtils {

    /**
     * 身份证脱敏
     *
     * @param idcard
     * @return
     */
    public static String isCardNumber(String idcard) {
        if (StringUtils.isBlank(idcard)) {
            return "";
        }
        return StringUtils.left(idcard, 3).concat(StringUtils
                .removeStart(StringUtils.leftPad(StringUtils.right(idcard, 4), StringUtils.length(idcard), "*"),
                        "***"));

    }

    /**
     * 电子邮箱脱敏
     *
     * @param email
     * @return
     */
    public static String email(String email) {
        if (StringUtils.isBlank(email)) {
            return "";
        }

        if (StringUtils.indexOf(email, "@") <= 1) {
            return "";
        }
        return StringUtils.leftPad(
                StringUtils.right(email, StringUtils.length(email) - StringUtils.indexOf(email, "@")),
                StringUtils.length(email),
                "*");

    }


    /**
     * 手机号码
     *
     * @param phone
     * @return
     */
    public static String mobilePhone(String phone) {
        if (StringUtils.isBlank(phone)) {
            return "";
        }

        return StringUtils.left(phone, 3).concat(StringUtils
                .removeStart(StringUtils.leftPad(StringUtils.right(phone, 4), StringUtils.length(phone), "*"),
                        "***"));
    }

}

5、实现序列化类

点击查看代码
public class SensitiveSerialize extends JsonSerializer<String> implements ContextualSerializer {

    SensitiveEnum enumtype;


    public SensitiveSerialize() {

    }

    public SensitiveSerialize(SensitiveEnum type) {
        this.enumtype = type;
    }

    @Override
    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        switch (this.enumtype) {
            case ID_CARD:
                jsonGenerator.writeString(SensitiveUtils.isCardNumber(s));
                break;
            case EMAIL:
                jsonGenerator.writeString(SensitiveUtils.email(s));
                break;
            case MOBILE_PHONE:
                jsonGenerator.writeString(SensitiveUtils.mobilePhone(s));
                break;
        }
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        if (!Objects.isNull(beanProperty)) {
            if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {
                SensitiveAnnantion sensitiveAnnantion = beanProperty.getAnnotation(SensitiveAnnantion.class);
                if (Objects.isNull(sensitiveAnnantion)) {
                    sensitiveAnnantion = beanProperty.getContextAnnotation(SensitiveAnnantion.class);
                } else {
                    return new SensitiveSerialize(sensitiveAnnantion.value());
                }
            }
            return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
        }

        return serializerProvider.findNullValueSerializer(beanProperty);
    }

}

6、定义注解

点击查看代码
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveSerialize.class)
public @interface SensitiveAnnantion {
    SensitiveEnum value();
}

7、测试

点击查看代码
## 实体类
@Data
@AllArgsConstructor
@Builder
public class UserModel {

    private Long userid;

    private String username;

    @SensitiveAnnantion(value = SensitiveEnum.EMAIL)
    private String email;

    @SensitiveAnnantion(value = SensitiveEnum.MOBILE_PHONE)
    private String phone;

    @SensitiveAnnantion(value = SensitiveEnum.ID_CARD)
    private String idcard;
}

## controller
@RestController
public class DemoController {

    @GetMapping(value = "/query")
    public UserModel Query() {
        return UserModel.builder()
                .email("[email protected]")
                .phone("17609329556")
                .idcard("111111111111111111")
                .userid(2023L)
                .username("张三")
                .build();
    }
}

## 测试结果
{
  "userid": 2023,
  "email": "**********@qq.com",
  "username": "张三",
  "phone": "176****9556",
  "idcard": "111***********1111"
}
Response file saved.
> 2023-03-19T121644.200.json

8、代码地址

https://gitee.com/douguangji/SpringBoot-Gather.git
image

标签:return,String,idcard,public,数据,email,脱敏
From: https://www.cnblogs.com/dgjword/p/17232833.html

相关文章

  • 使用TensorFlow实现MNIST数据集分类
    1MNIST数据集MNIST数据集由70000张28x28像素的黑白图片组成,每一张图片都写有0~9中的一个数字,每个像素点的灰度值在0~255(0是黑色,255是白色)之间。MINST数据集是由Yann......
  • flask-配置并连接数据库
    配置mysql驱动用pymysqlHOST='127.0.0.1'PORT=3306USERNAME='zhang3abc'PASSWORD='123456'DB='sitebbsdb'SQLALCHEMY_DATABASE_URI=f'mysql+pymysql://{USERNAME}......
  • 谈谈面试必问的Java内存区域(运行时数据区域)和内存模型(JMM)
    Java内存区域和内存模型是不一样的东西,内存区域是指JVM运行时将数据分区域存储,强调对内存空间的划分。而内存模型(JavaMemoryModel,简称JMM)是定义了线程和主内存之间......
  • 【Ajax技术】JQuery处理XML数据
    我们将之前写的应用使用jquery返回xml数据程序清单服务端Servelt:AjaxXMLServer.java静态页面:ajaxJqueryXml.htmljavascript脚本文件:verifyj......
  • P2241 统计方形(数据加强版)
    点击跳转>>P2241统计方形(数据加强版)-洛谷|计算机科学教育新生态(luogu.com.cn)题解(附注释):#include<bits/stdc++.h>usingnamespacestd;longlongn,m,cfx,zfx;/......
  • 数据库中的drop、truncate、 delete的区别
    drop直接删掉表。truncate删除表中数据,再插入时自增长id又从1开始。delete删除表中数据,可以加where字句。DELETE语句会记录日志以便进行回滚操作;TRUNCATETABLE不会......
  • Linux 远程数据同步工具详解(rsync)
    一、简介1认识Rsync(remotesynchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文......
  • 如何将Lync/Skype服务器KHI数据导入到SQL Server数据库
    介绍关键运行状况指标KHI(KeyHealthIndicators)是具有阈值的性能计数器,旨在揭示用户体验问题。通常,当我们看到Lync语音质量问题或性能问题(速度慢/掉线等)时,我们会查看性能......
  • 数据安全始终是一个不可忽视的问题
    最近,自己的一个测试环境,遭遇了hacker攻击。具体是oracle用户被攻破了,原因是该环境通过DDNS连接到了外网,而因为只是测试,没有注意安全防范,设置的口令过于简单。下面记录下,......
  • JavaScript 数据类型详解
    原文链接:​   ​​https://note.noxussj.top/?source=51cto​​常见的ES5数据类型分为基本数据类型、引用数据类型两种。包含字符串、数字、对象、数组、函数、布尔值......