项目敏感词脱敏如何实现

SpringBoot项目里用sensitive-word做敏感词过滤,这几点配置和自定义策略你得知道 本文深入探讨了在SpringBoot项目中集成sensitive-word进行敏感词过滤的最佳实践,包括多环境词库加载、动态词库更新、分级脱敏策略等高级配置。通过DFA算法优化和业务场景融合,实现高效、智能的敏感词过滤解决方案,提升内容审核效率与准确性。 阅读详情

后端返回数据给前端的时候,一般需要对敏感词脱敏,类似于下面这样:

图片

脱敏的规则有很多种,例如:

  • 替换(常用):将敏感数据中的特定字符或字符序列替换为其他字符。例如,将信用卡号中的中间几位数字替换为星号(*)或其他字符。

  • 删除:将敏感数据中的部分内容随机删除。例如,将电话号码的随机 3 位数字进行删除。

  • 重排:将原始数据中的某些字符或字段的顺序打乱。例如,将身份证号码的随机位交错互换。

  • 加噪:在数据中注入一些误差或者噪音,达到对数据脱敏的效果。例如,在敏感数据中添加一些随机生成的字符。

  • ......

这里以最常用的替换为例进行介绍,这也是我的项目用到的方法。

我是利用 Hutool 提供的 DesensitizedUtil脱敏工具类配合 Jackson 通过注解的方式完成数据脱敏的。

如果不想引入 Hutool 的话,也可以自己实现一个脱敏工具类,实现逻辑非常简单。

DesensitizedUtil脱敏工具类支持用户 ID、中文姓名、身份证号、座机号、手机号、电子邮件、银行卡号等脱敏数据类型,基本覆盖了常见的敏感信息。

DesensitizedUtil脱敏工具类的脱敏规则是隐藏掉信息中的一部分关键信息用*代替,例如:

  • 身份证号:原始值 51343620000320711X,脱敏后 5***************1X

  • 手机号:原始值 18049531999,脱敏后 180****1999

  • 银行卡号:原始值6217000130008255666,脱敏后6217 **** **** *** 5666

  • ......

除了支持常见的脱敏数据类型之外,Hutool 还提供了自定义隐藏方法StrUtil#hide。这个方法实际上是 CharSequenceUtil实现的,StrUtil继承了CharSequenceUtil。

图片

图片

因为我的项目是基于 Spring Boot 开发的,因此可以利用 Spring Boot 自带的 Jackson 自定义序列化实现,在 JSON 进行序列化渲染给前端时,进行脱敏。

下面是简化后的核心步骤:

1、我定义了一个用于脱敏的 Desensitization 注解。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
// 指定序列化时使用 DesensitizationSerialize 这个自定义序列化类
// DesensitizationSerializ 我们后面会自定义
@JsonSerialize(using = DesensitizationSerialize.class)
public @interface Desensitization {
    /**
     * 脱敏数据类型,在MY_RULE的时候,startInclude和endExclude生效
     */
    DesensitizationTypeEnum type() default DesensitizationTypeEnum.MY_RULE;

    /**
     * 脱敏开始位置(包含)
     */
    int startInclude() default 0;

    /**
     * 脱敏结束位置(不包含)
     */
    int endExclude() default 0;
}

DesensitizationTypeEnum 是脱敏策略的枚举:

public enum DesensitizationTypeEnum {
    //自定义
    MY_RULE,
    //用户id
    USER_ID,
    //手机号
    MOBILE_PHONE,
    //邮箱
    EMAIL,
    // 省略其他枚举字段
    // ...
}

2、自定义序列化类继承 JsonSerializer,实现 ContextualSerializer 接口,并重写 serialize() 和 createContextual() 这两个方法。

/**
 * 自定义序列化类,用于数据脱敏处理
 * 支持多种脱敏类型,包括自定义规则。
 */
@AllArgsConstructor
@NoArgsConstructor
public class DesensitizationSerialize extends JsonSerializer<String> implements ContextualSerializer {
    private DesensitizationTypeEnum type;
    private Integer startInclude;
    private Integer endExclude;

    @Override
    public void serialize(String str, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        switch (type) {
            // 自定义类型脱敏
            case MY_RULE:
                jsonGenerator.writeString(StrUtil.hide(str, startInclude, endExclude));
                break;
            // userId脱敏
            case USER_ID:
                jsonGenerator.writeString(String.valueOf(DesensitizedUtil.userId()));
                break;
            // 中文姓名脱敏
            case CHINESE_NAME:
                jsonGenerator.writeString(DesensitizedUtil.chineseName(String.valueOf(str)));
                break;
            // 省略其他数据类型脱敏
            // ......
        }
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        if (beanProperty != null) {
            // 判断数据类型是否为String类型
            if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {
                // 获取定义的注解
                Desensitization desensitization = beanProperty.getAnnotation(Desensitization.class);
                // 如果字段上没有注解,则从上下文中获取注解
                if (desensitization == null) {
                    desensitization = beanProperty.getContextAnnotation(Desensitization.class);
                }
                // 如果找到了注解,创建新的序列化实例
                if (desensitization != null) {
                    return new DesensitizationSerialize(desensitization.type(), desensitization.startInclude(), desensitization.endExclude());
                }
            }
            // 如果不是String类型,使用默认的序列化处理
            return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
        }
        // 如果beanProperty为null,返回默认的null值序列化处理
        return serializerProvider.findNullValueSerializer(null);
    }
}

这段代码有一个优化小技巧:可以将函数放进枚举类,进而避免使用 switch-case 语句,从而使代码更加简洁和易于维护。

public enum DesensitizationTypeEnum {
    // 自定义
    MY_RULE {
        @Override
        public String desensitize(String str, Integer startInclude, Integer endExclude) {
            return StrUtil.hide(str, startInclude, endExclude);
        }
    },
    // 用户id
    USER_ID {
        @Override
        public String desensitize(String str, Integer startInclude, Integer endExclude) {
            return String.valueOf(DesensitizedUtil.userId());
        }
    },
    MOBILE_PHONE {
        @Override
        public String desensitize(String str, Integer startInclude, Integer endExclude) {
            return String.valueOf(DesensitizedUtil.mobilePhone(str));
        }
    },
    EMAIL {
        @Override
        public String desensitize(String str, Integer startInclude, Integer endExclude) {
            return String.valueOf(DesensitizedUtil.email(str));
        }
    };
    // 省略其他枚举字段
    // ...
    public abstract String desensitize(String str, Integer startInclude, Integer endExclude);
}

这样的话,一行代码即可实现调用:

jsonGenerator.writeString(type.desensitize(str, startInclude, endExclude));

如果使用的序列化是 Fastjson 而不是默认的 Jackson,你可以创建一个自定义的 ValueFilter 来处理脱敏逻辑。

这里只是以 Jackson 和 Fastjson 为例说明,其他常见的序列化实现都有对应的解决方法。

3、经过上面两步之后就可以使用脱敏注解了。

在对应的字段上添加上脱敏注解即可:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    // 演示自定义脱敏
    @Desensitization(type = DesensitizationTypeEnum.MY_RULE, startInclude = 4, endExclude = 7)
    private String userid;

    @Desensitization(type = DesensitizationTypeEnum.MOBILE_PHONE)
    private String phone;

    @Desensitization(type = DesensitizationTypeEnum.EMAIL)
    private String email;

}

输出示例:

{
  "userid": "user***56",
  "phone": "181****8155",
  "email": ":*************@163.com"
}
数据安全的护航者:数据脱敏与敏感词过滤详解 阅读详情

相关推荐

Gazebo仿真环境下的强化学习实现

实际上利用Gazebo进行强化学习无非是环境获取上的不同,Gazebo的环境控制需要使用ROS服务进行控制,状态可以通过Gazebo进行获取,同时某些必要数据需要从话题中获取,最重要的是组织获取 的数据(通过话题等)与控制Gazebo的仿真步骤之间的组合。强化学习的手段与传统算法无异,强化学习方法最重要的是要确定动作空间、状态空间、奖励空间,这三个空间是work的前提。在笔者自己的环境中,将获取里程计的话题以及获取激光点的数据替换成为了自己的本机的仿真环境匹配的话题。

Moresweet 猫甜 6447

Java字符序列类CharSequence基本详解

CharSequence类是java.lang包下的一个接口,此接口对多种不同的对char访问的统一接口,像String、StringBuffer、StringBuilder类都是CharSequence的子接口; CharSequence类和String类都可以定义字符串,但是String定义的字符串只能读,CharSequence定义的字符串是可读可写的; 对于抽象类或者接口来说不可以直接

OceanSky的专栏 3万+

从零到一:手把手教你用YonBuilder for NCC搭建NC Cloud 2021.11开发环境(含避坑指南)

本文详细指导如何使用YonBuilder for NCC搭建NC Cloud 2021.11开发环境,涵盖硬件要求、软件安装、YonBuilder配置及常见故障排除。特别提供避坑指南,帮助开发者快速上手NCC开发,确保环境配置的原子化分解和开发思维的体系化建立。

weixin_42523326的博客 341

对敏感数据进行脱敏操作

/** * 数据脱敏 * * @param data * @param left 左边保留长度 * @param right 右边保留长度 * @return */ public String dataEncrypt(String data, int left, int right) { if (StringUtils.isBlank(data)) { return StringUtils.EMPTY; } return S

早起一杯咖啡 1044

使用PLINK做GWAS(2)

利用PLINK对单基因控制的性状进行定位,之前一篇文章粗滤的记录了一下使用PLINK的命令,本次博客主要记录一下如何根据SNP芯片的数据制作PLINK的格式,以及分析的步骤,最后数据的可视化。 首先,有的公司给的新片的数据就是一个excel表格,列表示的是样品,行表示的是基因型,基因型用ATCG构成,当然有的基因型是用数字0或者1表示的。下面我拿到的一个数据是15个样品构成的基因型,有13个样品是突变体,2个样品是野生型。 格式如下: 第二步:将此基因型存成csv文件,使用R进行读取,在R中制作pl

samhuairen的专栏 2921

【Inpho精品教程】Inpho简介、安装教程(附Inpho8安装包下载)

本文介绍Trimble旗下Inpho UASMaster航空摄影测量软件,涵盖其核心功能模块(如Match-AT、OrthoMaster、Summit Evolution等)及安装教程。文章详细说明了从安装到汉化破解的全过程,并提供Inpho 8.0.1安装包下载链接与提取码,适用于无人机摄影测量专业用户。

智慧空间实验室 1万+

CharSequenceUtilTest的使用

weixin_44681259的博客 552

Yield Management软件:Lam Research二次开发_(5).缺陷分析与分类方法

在半导体制造过程中,缺陷分析和分类是提高良率管理(Yield Management)的关键步骤。通过准确地识别和分类缺陷,可以更好地理解工艺过程中的问题,从而采取有效的措施来提高生产效率和产品质量。本节将详细介绍缺陷分析和分类的方法,包括缺陷检测、特征提取、分类算法及其在Lam Research软件中的应用。

2401_87715305的博客 687

脱敏技术!!!

数据脱敏(Data Masking)是一种数据安全技术,旨在通过预先设定的规则和算法,对原始数据中包含的敏感信息进行变形处理,使得这些信息在非生产环境(例如开发、测试、分析或培训场景)中使用时,既能保持原有数据格式和业务逻辑的真实性,又能有效保护个人隐私和商业机密不被泄露。在实施数据脱敏时,对诸如身份证号、手机号、银行卡号、个人姓名、家庭住址、电子邮件地址、医疗记录等敏感信息采取替换、遮盖、乱序、加密、截断等手段进行处理,以防止这些敏感信息在未经授权的情况下被识别或滥用。4.创建自定义的序列化脱敏类。

qq_64847107的博客 1188

【VTKExamples::PolyData】第十六期 GradientFilter

本文分享VTK样例GradientFilter,并解析接口vtkGradientFilter & vtkAssignAttribute,希望对各位小伙伴有所帮助!

qq_40041064的博客 319

Linux Kernel入门到精通系列讲解 - 总目录

在学习Linux Kernel之前,需要先准备开发环境,方便后续进行开发。可以根据自身情况,选择性阅读该章节。学习该章节之前,你应该了解一下网络概念,明白为什么要讲这些,才能更有方向的去理解学习。Linux ARM平台开发系列讲解(设备树篇) 4.1.1 设备树的原理详解。本项目完全开源,仅供学习使用,如需其他用途,请与本人联系。),本章节你可以学习到。摄像头V4L2子系统、Linux kernel常用的子系统等,ARM架构、RISCV架构、Uboot等。

DSMGUOGUO的博客 1万+

第十章 Java常用类库

常用类库

ge_zhe的博客 595

ArcGIS Pro 制作这种地图海报

ArcMap 版本与 ArcGIS Pro 版本的制图功能相差太多,无论从美观上还是制图效率都远远优于 ArcMap,用了一段时间的 ArcGIS Pro ,真心推荐有条件的大家赶紧试一试!一个软件也能搞定一张不错的海报哦!----吐槽:好的设计真的是门花时间的活,这个教程大概花了我7小时左右,我都忘了我自己教程中截图多少张了!(可能是我速度太慢了)测试数据:阿里云盘分享-----北极海冰数据.https://www.aliyundrive.com/s/SUhsnqfkmXh。

J_Giser的博客 1427

Java项目中实现敏感词脱敏的深度解析与实践

在软件开发中,保护用户隐私和数据安全是至关重要的。敏感词脱敏是一种常见的数据保护手段,它通过对敏感信息进行变形处理,确保隐私数据的安全性。本文将深入探讨在Java项目中如何实现敏感词脱敏,包括常用的脱敏策略、工具类库的使用以及具体的代码实现。

m0_73355421的博客 1334

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

项目中敏感词脱敏是如何实现

因为我的项目是基于 Spring Boot 开发的,因此可以利用 Spring Boot 自带的 Jackson 自定义序列化实现,在 JSON 进行序列化渲染给前端时,进行脱敏。脱敏工具类支持用户 ID、中文姓名、身份证号、座机号、手机号、电子邮件、银行卡号等脱敏数据类型,基本覆盖了常见的敏感信息。如果使用的序列化是 Fastjson 而不是默认的 Jackson,你可以创建一个自定义的。这里以最常用的替换为例进行介绍,这也是我的项目用到的方法。脱敏工具类的脱敏规则是隐藏掉信息中的一部分关键信息用。

qq_33650333的博客 688

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

自定义注解与@ControllerAdvice实现列表数据脱敏

自定义注解与@ControllerAdvice实现列表数据脱敏一、自定义注解1、什么是自定义注解 一、自定义注解 1、什么是自定义注解 (1) 自定义注解与类和接口的定义类似 (2) 关键字为:@interface 但该自定义注解上方需要加上一些注解去说明该注解的使用范围与使用时间点,如下@Target注解表示该注解应该在方法上进行使用,@Retention注解表示该注解的作用时间在运行和编译时都起作用 @Target(ElementType.METHOD) @Retention(RetentionPol

qq_42207682的博客 1267

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

官宣!Mybatis-Plus 官方神器发布!!!

今天推荐一个 MyBatis - Plus 官方发布的神器:mybatis-mate。mybatis-mate 为 Mybatis-Plus 企业级模块,支持分库分表,数据审计、数据敏感...

hnjsjsac的博客 976

Spring AI 避坑指南:被90%开发者忽略的AI应用安全风险,你的项目可能正在裸奔上线

随着Spring AI生态逐步成熟,越来越多的Java后端项目开始接入大模型能力,落地智能问答、知识库RAG、工具调用Agent、智能审批等业务场景。在项目迭代过程中,开发者大多聚焦响应速度优化、召回精度提升、对话体验优化等功能层面。AI应用安全防护缺失,项目完全裸奔上线。不同于传统Web项目的XSS、SQL注入漏洞,大模型应用诞生了全新的攻防体系。低门槛、高危害的AI专属攻击,能够轻松突破常规防护,造成核心配置泄露、服务器越权、服务雪崩、用户隐私批量泄露等严重生产事故。

srlsong的博客 184

rime中州韵小狼毫 敏感词脱敏滤镜

文章通过讲解 1 个字典文档,5 个 lua 脚本文档,在rime中州韵小狼毫输入法中配置了一个敏感词脱敏滤镜。通过对这 6 个文档的逐一讲解,相信大家也能够在理解每个文档的作用和使用方法的基础上可以灵活运用和配置更强大的功能词库。

dyy123 2525

交友平台系统实战:从业务模型、表结构到SpringBoot落地

社交类应用的后台系统设计往往涉及复杂的业务模型、关系数据管理和高并发消息处理。业务模型是否清晰、数据库表结构是否合理,直接影响推荐匹配、私信会话等核心功能的可靠性。通过标签相似度计算、Redis GEO地理位置检索、异步消息队列削峰等技术手段,可以在保证稳定性的同时提升用户体验。内容安全与风控机制也是上线前必须考虑的关键环节。本文以交友平台系统为例,完整拆解从SpringBoot技术选型、表结构设计到部署上线的实战路径,为Java开发者提供一套可直接借鉴的工程化方案。

weixin_29204121的博客 120

SpringBoot项目之敏感词校验

本文介绍了如何在SpringBoot项目中集成敏感词校验功能。通过引入GitHub上的sensitive-word工具包,配置SensitiveWordBs参数实现敏感词检测。文章详细说明了配置项含义、核心方法,并展示了如何通过RequestBodyAdvice实现请求体前置校验。该方案可有效提升内容质量,支持大小写、格式忽略等灵活配置,满足不同场景的敏感词过滤需求。

weixin_47491045的博客 1089

技术派安全防护:敏感词过滤与数据脱敏最佳实践

在当今互联网环境下,社区平台的数据安全防护已成为技术架构中不可或缺的重要环节。技术派作为一款功能强大的开源社区系统,在敏感词过滤和数据脱敏方面提供了完整的解决方案。本文将详细介绍技术派在数据安全防护方面的最佳实践,帮助开发者构建更加安全可靠的社区平台。🚀 ## 为什么需要敏感词过滤? 敏感词过滤是社区内容安全的第一道防线。无论是用户发布的文章、评论,还是聊天内容,都可能包含不当信息。技术派通

gitblog_00291的博客 698

一个注解搞定SpringBoot数据脱敏

在软件开发过程中,为了避免数据泄露,我们常常需要使用一些手段对特定的数据进行保护,例如用户的手机号、身份证、项目的输出日志等等,这些敏感的数据需要做特殊处理,有的是加密,有的是打掩码,我们可以借助一些工具包优雅的实现这些功能。这里我做了一个名为SensitiveBye的工具包,它可以在Java SE、Spring环境、SpringBoot环境中使用,实现接口字段、日志输出、数据库字段、敏感词库等类型数据脱敏需求,

weixin_39128397的博客 2858

java 实现敏感词(sensitive word)工具详解使用说明

sensitive-word 平时工作中,只要涉及到用户可以自由发言(博客、文档、论坛),就要考虑内容的敏感性处理。 sensitive-word 基于 DFA 算法实现的高性能敏感词工具。工具使用 java 实现,帮助我们解决常见的问题。 特性 6W+ 词库,且不断优化更新 基于 DFA 算法,性能较好 基于 fluent-api 实现,使用优雅简洁 支持敏感词的判断、返回、脱敏...

2万+

sensitive-word 敏感词开源工具使用入门

有时候我们希望将敏感词的加载设计成动态的,比如控台修改,然后可以实时生效。v0.0.13 支持了这种特性。简化伪代码如下,数据的源头为数据库。MyDdWordAllow 和 MyDdWordDeny 是基于数据库为源头的自定义实现类。@Autowired@Autowired/*** 初始化引导类* @return 初始化引导类*/@Bean// 各种其他配置.init();敏感词库的初始化较为耗时,建议程序启动时做一次 init 初始化。

4764

【技术派后端篇】技术派通用敏感词替换:原理、实现与应用

本文聚焦技术派通用敏感词替换技术。介绍 DFA 敏感词校验算法原理,阐述借助开源库构建敏感词服务类,详述基于 Mybatis 拦截器的数据库脱敏方案,提及实际效果与白名单机制,强调安全合规在项目中的重要性。

专注Java和MySQL领域知识分享 1307
上一篇: Springboot整合ShardingJdbc实现分库分表方案
y&m
y&m
博客等级 码龄9年 101粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值