字符脱敏工具类

文章目录

  • 1、字符脱敏工具类
  • 2、测试工具类
  • 3、测试结果:

1、字符脱敏工具类

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;/*** 数据脱敏工具类** @date 2024/10/30 13:44*/@Slf4j
public class DataDesensitizationUtils {public static final String STAR_1 = "*";public static final String STAR_2 = "**";public static final String STAR_3 = "***";public static final String STAR_4 = "****";/*** 手机号脱敏** @param mobile 手机号* @return 返回值*/public static String mobileDesensitize(String mobile) {// 如果手机号为空则返回空字符串if (StringUtils.isBlank(mobile)) {return "";}// 取手机号最后4位String right = StringUtils.right(mobile, 4);// 手机号除了最后4位都用*代替String leftPad = StringUtils.leftPad(right, StringUtils.length(mobile), STAR_1);// 移除前面默认的三位*String removeStart = StringUtils.removeStart(leftPad, STAR_3);// 取手机号前3位String left = StringUtils.left(mobile, 3);// 字符串链接并返回return left.concat(removeStart);}/*** 姓名脱敏** @param name 姓名* @return 返回值*/public static String nameDesensitize(String name) {// 名字为空则返回空字符串if (StringUtils.isBlank(name)) {return "";}// 名字长度小于等于3个字符,则将前面一个字符用*代替int length = 3;if (name.length() <= length) {int len = name.length() - 1;String right = StringUtils.right(name, len);return STAR_1.concat(right);}// 名字长度大于3个字符,则将前两个字符用*代替int len = name.length() - 2;String right = StringUtils.right(name, len);return STAR_2.concat(right);}/*** 地址脱敏** @param detailAddress 地址* @return 返回值*/public static String detailAddressDesensitize(String detailAddress) {int length = 10;String desensitizationText = STAR_4;// 地址为空或长度小于10个字符则默认返回*if (StringUtils.isBlank(detailAddress) || detailAddress.length() <= length) {return desensitizationText;} else {// 把地址10个字符后的所有字符替换为*StringBuilder address = new StringBuilder(detailAddress);int start = address.length() - 10;int end = address.length();return address.replace(start, end, desensitizationText).toString();}}/*** 对指定字符串的部分内容进行脱敏处理,替换为指定数量的星号。** @param start       需要脱敏的起始位置(包含)* @param end         需要脱敏的结束位置(不包含)* @param content     原始字符串* @param maxStarSize 最大星号数量,超出部分将被截断* @return 处理后的字符串*/public static String contentDesensitize(int start, int end, String content, int maxStarSize) {// 字符串为空则返回空字符串if (StringUtils.isBlank(content)) {return "";}// 起始位置不能小于0start = Math.max(0, start);// 结束位置不能大于字符串最大长度end = Math.min(content.length(), end);// 如果结束位置小于起始位置或者结束位置大于原始串长度,则返回原始串。if (end < start) {return content;}// 取两者最小值,即中间最多出现maxStarSize个*号int min = Math.min(end - start, maxStarSize);// 取两者最大值作为重复次数,即保证*号重复次数不为负数int count = Math.max(0, min);// 计算count次数的*号字符串,repeat是JDK11+提供的方法// JDK8可以使用以下方法 // String repeat = StringUtils.repeat(STAR_1, count);String repeat = STAR_1.repeat(count);// 将字符串start与end中间的明文替换为*号return new StringBuilder(content).replace(start, end, repeat).toString();}/*** 对指定字符串的部分内容进行脱敏处理,替换为指定数量的星号。** @param start   需要脱敏的起始位置(包含)* @param end     需要脱敏的结束位置(不包含)* @param content 原始字符串* @return 处理后的字符串*/public static String contentDesensitize(int start, int end, String content) {// 默认最大*号数量即中间替换字符数量return contentDesensitize(start, end, content, end - start);}}

2、测试工具类

@Slf4j
@ExtendWith(MockitoExtension.class)
public class DataDesensitizationUtilsTest {@Testpublic void testMobileDesensitize() {String mobile = "13011112222";String result = DataDesensitizationUtils.mobileDesensitize(mobile);log.info("手机号脱敏结果:{}", result);}@Testpublic void testNameDesensitize() {String name = "诸葛孔明";String result = DataDesensitizationUtils.nameDesensitize(name);log.info("姓名脱敏结果:{}", result);}@Testpublic void testAddressDesensitize() {String address = "北京首钢国际会展中心9号馆、10号馆";String result = DataDesensitizationUtils.detailAddressDesensitize(address);log.info("地址脱敏结果:{}", result);}@Testpublic void testStringUtils() {String param = "北京首钢国际会展中心9号馆、10号馆";String result1 = StringUtils.left(param, 3);log.info("处理结果1:{}", result1);String result2 = StringUtils.right(param, 4);log.info("处理结果2:{}", result2);String result3 = StringUtils.leftPad(result2, param.length(), "*");log.info("处理结果3:{}", result3);}@Testpublic void testContentDesensitize() {String param = "诸葛孔明";String result1 = DataDesensitizationUtils.contentDesensitize(1, 7, param);log.info("处理结果1:{}", result1);String result2 = DataDesensitizationUtils.contentDesensitize(1, param.length() - 7, param, 6);log.info("处理结果2:{}", result2);String result3 = DataDesensitizationUtils.contentDesensitize(0, param.length() + 7, param, 6);log.info("处理结果3:{}", result3);}}

3、测试结果:

2024-10-31 09:36:11 [INFO ] [main] - [] - com.summer.toolkit.service.DataDesensitizationUtilsTest.testNameDesensitize():30 - 姓名脱敏结果:**孔明
2024-10-31 09:36:11 [INFO ] [main] - [] - com.summer.toolkit.service.DataDesensitizationUtilsTest.testMobileDesensitize():23 - 手机号脱敏结果:130****2222
2024-10-31 09:36:11 [INFO ] [main] - [] - com.summer.toolkit.service.DataDesensitizationUtilsTest.testAddressDesensitize():37 - 地址脱敏结果:北京首钢国际会展****
2024-10-31 09:36:11 [INFO ] [main] - [] - com.summer.toolkit.service.DataDesensitizationUtilsTest.testStringUtils():44 - 处理结果1:北京首
2024-10-31 09:36:11 [INFO ] [main] - [] - com.summer.toolkit.service.DataDesensitizationUtilsTest.testStringUtils():47 - 处理结果2:10号馆
2024-10-31 09:36:11 [INFO ] [main] - [] - com.summer.toolkit.service.DataDesensitizationUtilsTest.testStringUtils():50 - 处理结果3:**************10号馆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/461246.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kaggle “Reducing Commercial Aviation Fatalities” 比赛 生理数据分析

1、背景 Kaggle在2018 年 12 月 20 日举办“Reducing Commercial Aviation Fatalities” 比赛&#xff0c;通过收集飞行员的生理数据&#xff0c;判断飞行员何时会遇到麻烦吗&#xff1f;该比赛主要分析飞行员的问题&#xff0c;因为航班多、时间不固定&#xff0c;飞行员会出…

Python 字符串类型中 ``split(“\n“)`` 与 ``splitlines()`` 方法的一些区别

最近在以 self.__print("#" * 20 "\n") 调用自己写的 __print 接口时发现打印的时候 "\n" 没有打出来&#xff0c;进而发现了 split("\n") 与 splitlines() 方法的一些区别。 一个是参数上&#xff0c;split 需要传递一个字符串作为…

开源库 FloatingActionButton

开源库FloatingActionButton Github:https://github.com/Clans/FloatingActionButton 这个库是在前面这个库android-floating-action-button的基础上修改的&#xff0c;增加了一些更强大和实用的特性。 特性&#xff1a; Android 5.0 以上点击会有水波纹效果 可以选择自定义…

““ 引用类型应用举例

#include <iostream> //使能cin(),cout(); #include <stdlib.h> //使能exit(); #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和resetiosflags(); //setbase( char x )是设置输出数字的基数,如输出进制数则用se…

无人机避障——2D栅格地图pgm格式文件路径规划代码详解

代码和测试效果请看上一篇博客&#xff1a; 无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划-CSDN博客 更换模型文件.dae&#xff1a; 部分模型文件可以从这里下载&#xff1a; https://github.com/ethz-asl/rotors_simulator/wiki 将原先代码中的car.dae文件…

科研项目:利用AI大模型获得基金资助的10个原则

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 以ChatGPT为代表的大语言模型的诞生后&#xff0c;在学术界这些大模型LLM驱动的聊天机器人已经成为大家撰写和修订论文、基金申请书的流行工具。这些LLM经过千亿文本训练&…

CVE-2022-0185

这是一个关于整型溢出的CVE。 static int legacy_parse_param(struct fs_context *fc, struct fs_parameter *param) {struct legacy_fs_context *ctx fc->fs_private; // [1] ctx 与文件描述符相关unsigned int size ctx->data_size; // [2] size —— 目前已经写…

【Linux网络】TCP_Socket

目录 TCP协议&#xff08;传输控制协议&#xff09; listen状态 accept和connect TCP_echo_server (1)创建套接字 &#xff08;2&#xff09;绑定 &#xff08;3&#xff09;设置listen状态 &#xff08;4&#xff09;loop &#xff08;5&#xff09;客户端 多线程远程…

摄像机实时接入分析平台LiteAIServer视频智能分析软件视频诊断中的抖动检测功能

在现代社会中&#xff0c;视频监控系统扮演着至关重要的角色&#xff0c;而视频质量直接影响到监控系统的可靠性和有效性。随着技术的不断进步&#xff0c;视频智能分析软件LiteAIServer作为一款领先的视频智能分析软件&#xff0c;通过引入抖动检测功能&#xff0c;进一步提升…

Excel重新踩坑4:快捷键;逻辑函数;文本函数;日期相关函数;查找与引用函数;统计类函数;数组公式

0、excel常用快捷键 基础快捷键&#xff1a; alt&#xff1a;快速区域求和&#xff1b; ★ altenter&#xff1a;强制换行&#xff08;因为在excel单元格中没法用enter换行&#xff09;&#xff1b;altj&#xff1a;强制换行符的替换删除&#xff0c;这里altj就是在替换中输入…

ABAP RFC SQL 模糊查询和多个区间条件

对于非选择屏幕的情况&#xff0c;RFC接口输入数据后&#xff0c;如何处理字符串模糊查询、日期区间查询、数字区间查询&#xff1a; 一、所有字符支持模糊查询&#xff0c;在SAP SQL中&#xff0c;使用 %S%来实现。 二、区间查询有3种情况&#xff1a; 1、没有值输入&#xf…

python通过pyperclip库操作剪贴板

pyperclip介绍 pyperclip是一个python库用于操作剪贴板&#xff0c;可以非常方便地将文本复制到剪贴板或从剪贴板获取文本。 通过pip进行安装&#xff1a;pip install pyperclip pyperclip的github地址 pyperclip使用 复制到剪贴板 import pypercliptext "Hello, Wo…

Golang | Leetcode Golang题解之第516题最长回文子序列

题目&#xff1a; 题解&#xff1a; func longestPalindromeSubseq(s string) int {n : len(s)dp : make([][]int, n)for i : range dp {dp[i] make([]int, n)}for i : n - 1; i > 0; i-- {dp[i][i] 1for j : i 1; j < n; j {if s[i] s[j] {dp[i][j] dp[i1][j-1] …

Virtuoso使用layout绘制版图、使用Calibre验证DRC和LVS

1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后&#xff0c;在原理图界面点击Launch&#xff0c;点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找到Generate All from Source。 2、在Generate Layout界面&#xff0c;选中“Instance”&#…

摩科智能化一体化防盗门(物联网)项目

一&#xff0c;选题依据及意义 ①理论意义 目前国内外学者对智能门锁的研究取得了一些成果&#xff0c;但都局限于猫眼和门锁设计上。本课题在产品设计、服务设计等理论基础上&#xff0c;深入研究在安全与防护的背景下简约化即智能应用的门锁创新。在理论与实际探索上建立了…

记录一下方便的条件编译

1. 需要准备&#xff1a; 1-1、npm i cross-env -D 是跨平台的自定义编译 1-2、构造工具&#xff1a;vite/webpack > vite: import.meta.env.VITE_NODE_ENV > webpack:process.env.NODE_ENV这里使用vite为例子 1-3、 package.json 2. 思路与步骤 首先我们知道 axio…

企业数据泄露安全演练(分享)

该文章主要分享作者在XXX企业内部做的一次【数据泄露安全演练】&#xff0c;涉及演练背景、目的、演练流程、剧本设定、预期行为、结果等等。 以下是完整的演练方案&#xff0c;有不足的地方希望大家指出&#xff01;&#xff01; 需要原版方案电子版的可以联系作者获取。 演练…

[前端面试]计算机网络

TCP/IP 与OSI TCP/IP TCP/IP 四层模型是一个分层网络通信模型&#xff0c; 它将网络通信过程分为四个层次&#xff0c;这四层分别是&#xff1a;网络接口层、互联网层、传输层和应用层。 网络接口层负责在计算机和网络硬件之间传输数据&#xff0c;负责在物理网络上发送和接…

Conmi的正确答案——在Kibana中进入Elasticsearch的索引管理页面

Elasticsearch版本&#xff1a;7.17.25 Kibana版本&#xff1a;7.17.25 注&#xff1a;索引即类似mysql的表。 0、进入首页 1、未创建任何“索引模式”时&#xff1a; 1.1、点击左边的三横菜单&#xff1b; 1.2、点击“Discover”&#xff0c;进入“发现”页面&#xff1b; 2…