SpringBoot中的數(shù)據(jù)脫敏處理詳解
Spring Boot中的數(shù)據(jù)脫敏處理
今天我們來探討一下在Spring Boot中如何進(jìn)行數(shù)據(jù)脫敏處理。
1. 引言
數(shù)據(jù)脫敏是指對(duì)敏感數(shù)據(jù)進(jìn)行部分或全部掩蓋,以保護(hù)數(shù)據(jù)隱私。
在實(shí)際應(yīng)用中,我們常常需要在日志、API響應(yīng)或者數(shù)據(jù)庫中對(duì)敏感數(shù)據(jù)進(jìn)行脫敏處理,比如身份證號(hào)、手機(jī)號(hào)、郵箱地址等。
Spring Boot提供了強(qiáng)大的框架支持,使得我們可以輕松地實(shí)現(xiàn)數(shù)據(jù)脫敏。
2. 數(shù)據(jù)脫敏的場(chǎng)景
常見的數(shù)據(jù)脫敏場(chǎng)景包括:
- 日志記錄:防止敏感信息在日志中泄露。
- API響應(yīng):保護(hù)用戶隱私,防止敏感信息暴露給客戶端。
- 數(shù)據(jù)庫存儲(chǔ):在存儲(chǔ)之前對(duì)數(shù)據(jù)進(jìn)行脫敏處理,以確保數(shù)據(jù)安全。
3. 定義脫敏注解
我們首先定義一個(gè)注解@SensitiveData,用于標(biāo)記需要脫敏的字段。
package cn.juwatech.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface SensitiveData {
SensitiveType value();
}同時(shí),我們定義一個(gè)枚舉SensitiveType來表示不同的脫敏類型。
package cn.juwatech.annotation;
public enum SensitiveType {
CHINESE_NAME, ID_CARD, PHONE_NUMBER, EMAIL
}4. 實(shí)現(xiàn)脫敏處理器
接下來,我們實(shí)現(xiàn)一個(gè)脫敏處理器SensitiveDataSerializer,用于對(duì)標(biāo)記了@SensitiveData注解的字段進(jìn)行脫敏處理。
package cn.juwatech.util;
import cn.juwatech.annotation.SensitiveData;
import cn.juwatech.annotation.SensitiveType;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
public class SensitiveDataSerializer extends JsonSerializer<String> {
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
SensitiveData sensitiveData = serializers.getActiveView().getAnnotation(SensitiveData.class);
if (sensitiveData != null) {
SensitiveType type = sensitiveData.value();
switch (type) {
case CHINESE_NAME:
gen.writeString(maskChineseName(value));
break;
case ID_CARD:
gen.writeString(maskIdCard(value));
break;
case PHONE_NUMBER:
gen.writeString(maskPhoneNumber(value));
break;
case EMAIL:
gen.writeString(maskEmail(value));
break;
default:
gen.writeString(value);
}
} else {
gen.writeString(value);
}
}
private String maskChineseName(String name) {
if (name.length() <= 1) {
return "*";
}
return name.charAt(0) + "*".repeat(name.length() - 1);
}
private String maskIdCard(String idCard) {
return idCard.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1******$2");
}
private String maskPhoneNumber(String phoneNumber) {
return phoneNumber.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
}
private String maskEmail(String email) {
int atIndex = email.indexOf("@");
if (atIndex <= 1) {
return "*".repeat(atIndex) + email.substring(atIndex);
}
return email.charAt(0) + "*".repeat(atIndex - 1) + email.substring(atIndex);
}
}5. 配置Jackson
為了讓Jackson在序列化時(shí)使用我們的脫敏處理器,我們需要進(jìn)行相關(guān)配置。
package cn.juwatech.config;
import cn.juwatech.util.SensitiveDataSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(String.class, new SensitiveDataSerializer());
objectMapper.registerModule(module);
return objectMapper;
}
}6. 使用脫敏注解
現(xiàn)在我們可以在需要脫敏的字段上使用@SensitiveData注解。例如:
package cn.juwatech.model;
import cn.juwatech.annotation.SensitiveData;
import cn.juwatech.annotation.SensitiveType;
public class User {
private String username;
@SensitiveData(SensitiveType.CHINESE_NAME)
private String realName;
@SensitiveData(SensitiveType.ID_CARD)
private String idCard;
@SensitiveData(SensitiveType.PHONE_NUMBER)
private String phoneNumber;
@SensitiveData(SensitiveType.EMAIL)
private String email;
// Getters and Setters
}7. 控制器示例
最后,我們編寫一個(gè)控制器來測(cè)試數(shù)據(jù)脫敏功能。
package cn.juwatech.controller;
import cn.juwatech.model.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/user")
public User getUser() {
User user = new User();
user.setUsername("johndoe");
user.setRealName("張三");
user.setIdCard("123456789012345678");
user.setPhoneNumber("13800138000");
user.setEmail("johndoe@example.com");
return user;
}
}啟動(dòng)Spring Boot應(yīng)用并訪問/user端點(diǎn),可以看到返回的JSON中敏感數(shù)據(jù)已經(jīng)被脫敏處理。
總結(jié)
本文介紹了在Spring Boot中如何進(jìn)行數(shù)據(jù)脫敏處理。通過自定義注解和Jackson配置,我們可以輕松實(shí)現(xiàn)對(duì)敏感數(shù)據(jù)的脫敏,保護(hù)用戶隱私。
在實(shí)際應(yīng)用中,我們可以根據(jù)具體需求靈活調(diào)整脫敏策略,確保數(shù)據(jù)安全。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot中實(shí)現(xiàn)數(shù)據(jù)脫敏的六種常用方案
- 使用SpringBoot整合Sharding Sphere實(shí)現(xiàn)數(shù)據(jù)脫敏的示例
- SpringBoot中實(shí)現(xiàn)數(shù)據(jù)脫敏處理的方法詳解
- SpringBoot敏感數(shù)據(jù)脫敏的處理方式
- SpringBoot數(shù)據(jù)脫敏的實(shí)現(xiàn)示例
- 淺析如何在SpringBoot中實(shí)現(xiàn)數(shù)據(jù)脫敏
- SpringBoot動(dòng)態(tài)實(shí)現(xiàn)數(shù)據(jù)脫敏的實(shí)戰(zhàn)指南
相關(guān)文章
簡(jiǎn)單聊聊RabbitMQ中的隊(duì)頭阻塞問題
這篇文章主要為大家詳細(xì)介紹了RabbitMQ中的隊(duì)頭阻塞問題以及相關(guān)的解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
java中BigDecimal進(jìn)行加減乘除的基本用法
大家應(yīng)該對(duì)于不需要任何準(zhǔn)確計(jì)算精度的數(shù)字可以直接使用float或double運(yùn)算,但是如果需要精確計(jì)算的結(jié)果,則必須使用BigDecimal類,而且使用BigDecimal類也可以進(jìn)行大數(shù)的操作。下面這篇文章就給大家介紹介紹關(guān)于java中BigDecimal進(jìn)行加減乘除的基本用法。2016-12-12
圖解Java經(jīng)典算法希爾排序的原理與實(shí)現(xiàn)
希爾排序是希爾(Donald Shell)于1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡(jiǎn)單插入排序經(jīng)過改進(jìn)之后的一個(gè)更高效的版本,也稱為縮小增量排序,同時(shí)該算法是沖破O(n2)的第一批算法之一。本文會(huì)以圖解的方式詳細(xì)介紹希爾排序的基本思想及其代碼實(shí)現(xiàn)2022-09-09
SpringBoot運(yùn)行時(shí)修改定時(shí)任務(wù)Cron表達(dá)式的實(shí)現(xiàn)方案
在項(xiàng)目開發(fā)中,定時(shí)任務(wù)是一個(gè)常見的需求,SpringBoot通過@Scheduled注解提供了簡(jiǎn)便的定時(shí)任務(wù)實(shí)現(xiàn)方式,但默認(rèn)情況下,一旦應(yīng)用啟動(dòng),定時(shí)任務(wù)的Cron表達(dá)式就無法動(dòng)態(tài)調(diào)整,本文將介紹如何在SpringBoot應(yīng)用運(yùn)行期間動(dòng)態(tài)修改定時(shí)任務(wù)的Cron表達(dá)式,需要的朋友可以參考下2025-06-06
java中的Timer和Timertask的關(guān)系解讀
本文詳細(xì)介紹了Java中的Timer和TimerTask類,包括它們之間的關(guān)系、API的使用方法、注意事項(xiàng)以及操作案例,Timer是一個(gè)調(diào)度器,而TimerTask是具體的任務(wù)類,Timer僅對(duì)應(yīng)一個(gè)線程,不保證任務(wù)執(zhí)行的精確性,但線程安全,一個(gè)Timer可以調(diào)度多個(gè)TimerTask2024-12-12
SpringBoot使用Redis實(shí)現(xiàn)消息隊(duì)列的方法小結(jié)
在應(yīng)用中把Redis當(dāng)成消息隊(duì)列來使用已經(jīng)屢見不鮮了,我想主要原因是當(dāng)代應(yīng)用十有八九都會(huì)用到 Redis,因此不用再引入其他消息隊(duì)列系統(tǒng),而且Redis提供了好幾種實(shí)現(xiàn)消息隊(duì)列的方法,用起來也簡(jiǎn)單,本文給大家介紹了SpringBoot使用Redis實(shí)現(xiàn)消息隊(duì)列的方法小結(jié)2024-04-04
SpringMVC架構(gòu)的項(xiàng)目 js,css等靜態(tài)文件導(dǎo)入有問題的解決方法
下面小編就為大家?guī)硪黄猄pringMVC架構(gòu)的項(xiàng)目 js,css等靜態(tài)文件導(dǎo)入有問題的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
java正則替換括號(hào)中的逗號(hào)實(shí)現(xiàn)示例
本文主要介紹了java正則替換括號(hào)中的逗號(hào)實(shí)現(xiàn)示例,主要介紹了兩種示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01

