JAVA 数据脱敏

工具脱敏工具类

/**
 * 脱敏工具类
 *
 * @author mayee
 * @version v1.0
 **/
public class DesensitizedUtils {

	/**
	 * 对字符串进行脱敏操作
	 * @param origin 原始字符串
	 * @param prefixNoMaskLen 左侧需要保留几位明文字段
	 * @param suffixNoMaskLen 右侧需要保留几位明文字段
	 * @param maskStr 用于遮罩的字符串, 如'*'
	 * @return 脱敏后结果
	 */
	public static String desValue(String origin, int prefixNoMaskLen, int suffixNoMaskLen, String maskStr) {
		if (origin == null) {
			return null;
		}

		StringBuilder sb = new StringBuilder();
		for (int i = 0, n = origin.length(); i < n; i++) {
			if (i < prefixNoMaskLen) {
				sb.append(origin.charAt(i));
				continue;
			}
			if (i > (n - suffixNoMaskLen - 1)) {
				sb.append(origin.charAt(i));
				continue;
			}
			sb.append(maskStr);
		}
		return sb.toString();
	}

	/**
	 * 【中文姓名】只显示最后一个汉字,其他隐藏为星号,比如:**梦
	 * @param fullName 姓名
	 * @return 结果
	 */
	public static String chineseName(String fullName) {
		if (fullName == null) {
			return null;
		}
		return desValue(fullName, 0, 1, "*");
	}

	/**
	 * 【身份证号】显示前六位, 四位,其他隐藏。共计18位或者15位,比如:340304*******1234
	 * @param id 身份证号码
	 * @return 结果
	 */
	public static String idCardNum(String id) {
		return desValue(id, 6, 4, "*");
	}

	/**
	 * 【固定电话】后四位,其他隐藏,比如 ****1234
	 * @param num 固定电话
	 * @return 结果
	 */
	public static String fixedPhone(String num) {
		return desValue(num, 0, 4, "*");
	}

	/**
	 * 【手机号码】前三位,后四位,其他隐藏,比如135****6810
	 * @param num 手机号码
	 * @return 结果
	 */
	public static String mobilePhone(String num) {
		return desValue(num, 3, 4, "*");
	}

	/**
	 * 【地址】只显示到地区,不显示详细地址,比如:北京市海淀区****
	 * @param address 地址
	 * @return 结果
	 */
	public static String address(String address) {
		return desValue(address, 6, 0, "*");
	}

	/**
	 * 【电子邮箱 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示,比如:d**@126.com
	 * @param email 电子邮箱
	 * @return 结果
	 */
	public static String email(String email) {
		if (email == null) {
			return null;
		}
		int index = StrUtil.indexOf(email, '@');
		if (index <= 1) {
			return email;
		}
		String preEmail = desValue(email.substring(0, index), 1, 0, "*");
		return preEmail + email.substring(index);

	}

	/**
	 * 【银行卡号】前六位,后四位,其他用星号隐藏每位1个星号,比如:622260**********1234
	 * @param cardNum 银行卡号
	 * @return 结果
	 */
	public static String bankCard(String cardNum) {
		return desValue(cardNum, 6, 4, "*");
	}

	/**
	 * 【密码】密码的全部字符都用*代替,比如:******
	 * @param password 密码
	 * @return 结果
	 */
	public static String password(String password) {
		if (password == null) {
			return null;
		}
		return "******";
	}

	/**
	 * 【密钥】密钥除了最后三位,全部都用*代替,比如:***xdS 脱敏后长度为6,如果明文长度不足三位,则按实际长度显示,剩余位置补*
	 * @param key 密钥
	 * @return 结果
	 */
	public static String key(String key) {
		if (key == null) {
			return null;
		}
		int viewLength = 6;
		StringBuilder tmpKey = new StringBuilder(desValue(key, 0, 3, "*"));
		if (tmpKey.length() > viewLength) {
			return tmpKey.substring(tmpKey.length() - viewLength);
		}
		else if (tmpKey.length() < viewLength) {
			int buffLength = viewLength - tmpKey.length();
			for (int i = 0; i < buffLength; i++) {
				tmpKey.insert(0, "*");
			}
			return tmpKey.toString();
		}
		else {
			return tmpKey.toString();
		}
	}
### Java 数据脱敏框架或库推荐 在Java项目中,数据脱敏是一项重要的任务,用于保护敏感信息并满足隐私法规的要求。以下是一些常用的Java数据脱敏框架和库的推荐: #### 1. **Jasypt** Jasypt(Java Simplified Encryption)是一个开源的Java加密库,支持对数据字段、配置文件等进行加密和解密操作。它提供了简单易用的API,能够轻松实现数据脱敏功能[^1]。 - **特点**: - 支持多种加密算法(如AES、DES等)。 - 提供了Spring集成的支持,便于在Spring项目中使用。 - 可以对数据库中的敏感字段进行自动加密和解密。 - **适用场景**:适合需要对数据字段进行加密存储的场景。 #### 2. **Apache Commons Text** Apache Commons Text 是一个通用的文本处理库,其中包含了一些字符串操作工具类,可以用于实现简单的数据脱敏逻辑。例如,可以通过正则表达式或字符串替换来隐藏敏感信息[^2]。 - **特点**: - 提供了灵活的字符串操作方法。 - 轻量级,易于集成到现有项目中。 - **适用场景**:适用于简单的字符串脱敏需求,如手机号、身份证号的部分隐藏。 #### 3. **MyBatis Plus 插件** MyBatis Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上提供了更多的功能扩展。通过自定义插件或拦截器,可以实现对查询结果的数据脱敏处理[^3]。 - **特点**: - 在 SQL 查询结果返回时自动对敏感字段进行脱敏。 - 支持动态配置脱敏规则。 - **适用场景**:适合与 MyBatis 集成的项目,能够减少手动处理脱敏的工作量。 #### 4. **Jackson 自定义序列化** Jackson 是一个流行的 JSON 处理库,通过自定义序列化器,可以实现对敏感字段脱敏处理[^4]。 - **特点**: - 在对象序列化为 JSON 时自动对敏感字段进行脱敏。 - 支持复杂的脱敏规则定义。 - **适用场景**:适合需要将脱敏后的数据输出为 JSON 格式的场景。 #### 5. **DesensitizationUtils** 这是一个轻量级的数据脱敏工具类,通常由开发者自行封装或从开源社区获取。它基于正则表达式或字符串操作实现,可以满足大多数常见的脱敏需求。 - **特点**: - 灵活易用,可以根据业务需求定制脱敏规则。 - 不依赖任何第三方框架。 - **适用场景**:适合小型项目或不需要复杂脱敏逻辑的场景。 #### 示例代码 以下是一个使用 Jackson 自定义序列化器实现数据脱敏的示例: ```java package com.example.dto; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; public class TestJacksonSerialize extends StdSerializer<String> { public TestJacksonSerialize() { this(null); } public TestJacksonSerialize(Class<String> t) { super(t); } @Override public void serialize(String phone, JsonGenerator gen, SerializerProvider provider) throws IOException { if (phone == null || phone.length() < 7) { gen.writeString(phone); } else { gen.writeString(phone.substring(0, 3) + "****" + phone.substring(7)); } } } ``` ### 总结 根据实际需求选择合适的框架或库是关键。如果需要对数据字段进行加密存储,可以选择 Jasypt;如果需要对查询结果进行脱敏处理,可以选择 MyBatis Plus 插件;如果需要将脱敏后的数据输出为 JSON 格式,可以选择 Jackson 自定义序列化器。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值