AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

輕松實現 SpringBoot 中的隱私數據脫敏處理

來源: 責編: 時間:2024-02-05 09:31:55 237觀看
導讀前言這兩天在整改等保測出的問題,里面有一個用戶信息泄露的風險項(就是后臺系統里用戶的一些隱私數據直接明文顯示了),其實指的就是要做數據脫敏。數據脫敏:把系統里的一些敏感數據進行加密處理后再返回,達到保護隱私作用,實

前言

這兩天在整改等保測出的問題,里面有一個用戶信息泄露的風險項(就是后臺系統里用戶的一些隱私數據直接明文顯示了),其實指的就是要做數據脫敏。Q7028資訊網——每日最新資訊28at.com

數據脫敏:把系統里的一些敏感數據進行加密處理后再返回,達到保護隱私作用,實現效果圖如下:Q7028資訊網——每日最新資訊28at.com

圖片圖片Q7028資訊網——每日最新資訊28at.com

其實要實現上面的效果,可能最先想到的方法是直接改每個接口,在返回數據前做一次加密處理,當然這個方法肯定是非常撈的。這里推薦用注解來實現,即高效又優雅,省時省力,支持擴展。Q7028資訊網——每日最新資訊28at.com

其實解決方案大體上分兩種:Q7028資訊網——每日最新資訊28at.com

  • 在拿到數據時就已經脫敏了(如在 mysql 查詢時用 insert 函數進行隱藏)
  • 拿到數據后在序列化的時候再進行脫敏(如用 fastjson、jackson)

這里我所選用的方案是第二種,即在接口返回數據前,在序列化的時候對敏感字段值進行處理,并且選用 jackson 的序列化來實現(推薦)Q7028資訊網——每日最新資訊28at.com

實現

創建隱私數據類型枚舉

/** * 隱私數據類型枚舉 */@Getterpublic enum PrivacyTypeEnum {  /** 自定義(此項需設置脫敏的范圍)*/  CUSTOMER,  /** 姓名 */  NAME,  /** 身份證號 */  ID_CARD,  /** 手機號 */  PHONE,  /** 郵箱 */  EMAIL,}

創建自定義隱私注解

/** * 自定義數據脫敏注解 */@Target(ElementType.FIELD) // 作用在字段上@Retention(RetentionPolicy.RUNTIME) // class文件中保留,運行時也保留,能通過反射讀取到@JacksonAnnotationsInside // 表示自定義自己的注解PrivacyEncrypt@JsonSerialize(using = PrivacySerializer.class) // 該注解使用序列化的方式public @interface PrivacyEncrypt {    /**     * 脫敏數據類型(沒給默認值,所以使用時必須指定type)     */    PrivacyTypeEnum type();    /**     * 前置不需要打碼的長度     */    int prefixNoMaskLen() default 1;    /**     * 后置不需要打碼的長度     */    int suffixNoMaskLen() default 1;    /**     * 用什么打碼     */    String symbol() default "*";}

創建自定義序列化器

@NoArgsConstructor@AllArgsConstructorpublic class PrivacySerializer extends JsonSerializer<String> implements ContextualSerializer {    // 脫敏類型    private PrivacyTypeEnum privacyTypeEnum;    // 前幾位不脫敏    private Integer prefixNoMaskLen;    // 最后幾位不脫敏    private Integer suffixNoMaskLen;    // 用什么打碼    private String symbol;    @Override    public void serialize(String origin, final JsonGenerator jsonGenerator,                          final SerializerProvider serializerProvider) throws IOException {        if (StrUtil.isEmpty(origin)) {            origin = null;        }        if (null != privacyTypeEnum) {            switch (privacyTypeEnum) {                case CUSTOMER:                    jsonGenerator.writeString(PrivacyUtil.desValue(origin, prefixNoMaskLen, suffixNoMaskLen, symbol));                    break;                case NAME:                    jsonGenerator.writeString(PrivacyUtil.hideChineseName(origin));                    break;                case ID_CARD:                    jsonGenerator.writeString(PrivacyUtil.hideIDCard(origin));                    break;                case PHONE:                    jsonGenerator.writeString(PrivacyUtil.hidePhone(origin));                    break;                case EMAIL:                    jsonGenerator.writeString(PrivacyUtil.hideEmail(origin));                    break;                default:                    throw new IllegalArgumentException("unknown privacy type enum " + privacyTypeEnum);            }        }    }    @Override    public JsonSerializer<?> createContextual(final SerializerProvider serializerProvider,                                              final BeanProperty beanProperty) throws JsonMappingException {        if (null != beanProperty) {            if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {                PrivacyEncrypt privacyEncrypt = beanProperty.getAnnotation(PrivacyEncrypt.class);                if (null == privacyEncrypt) {                    privacyEncrypt = beanProperty.getContextAnnotation(PrivacyEncrypt.class);                }                if (null != privacyEncrypt) {                    return new PrivacySerializer(privacyEncrypt.type(), privacyEncrypt.prefixNoMaskLen(),                            privacyEncrypt.suffixNoMaskLen(), privacyEncrypt.symbol());                }            }            return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);        }        return serializerProvider.findNullValueSerializer(null);    }}

這里是具體的實現過程,因為要脫敏的數據都是 String 類型的,所以繼承 JsonSerializer 時的類型填 StringQ7028資訊網——每日最新資訊28at.com

  • 重寫的 serialize 方法是實現脫敏的核心,根據類型 type 的不同去設置序列化后的值
  • 重寫的 createContextual 方法,就是去讀取我們自定義的 PrivacyEncrypt 注解,打造一個上下文的環境

隱私數據隱藏工具類

public class PrivacyUtil {    /**     * 中文名脫敏     */    public static String hideChineseName(String chineseName) {        if (StrUtil.isEmpty(chineseName)) {            return null;        }        if (chineseName.length() <= 2) {            return desValue(chineseName, 1, 0, "*");        }        return desValue(chineseName, 1, 1, "*");    }    /**     * 手機號脫敏     */    public static String hidePhone(String phone) {        if (StrUtil.isEmpty(phone)) {            return null;        }        return phone.replaceAll("(//d{3})//d{4}(//d{4})", "$1****$2"); // 隱藏中間4位//        return desValue(phone, 3, 4, "*"); // 隱藏中間4位//        return desValue(phone, 7, 0, "*"); // 隱藏末尾4位    }    /**     * 郵箱脫敏     */    public static String hideEmail(String email) {        if (StrUtil.isEmpty(email)) {            return null;        }        return email.replaceAll("(//w?)(//w+)(//w)(@//w+//.[a-z]+(//.[a-z]+)?)", "$1****$3$4");    }    /**     * 身份證號脫敏     */    public static String hideIDCard(String idCard) {        if (StrUtil.isEmpty(idCard)) {            return null;        }        return idCard.replaceAll("(//d{4})//d{10}(//w{4})", "$1*****$2");    }    /**     * 對字符串進行脫敏操作     * @param origin          原始字符串     * @param prefixNoMaskLen 左側需要保留幾位明文字段     * @param suffixNoMaskLen 右側需要保留幾位明文字段     * @param maskStr         用于遮罩的字符串, 如'*'     * @return 脫敏后結果     */    public static String desValue(String origin, int prefixNoMaskLen, int suffixNoMaskLen, String maskStr) {        if (StrUtil.isEmpty(origin)) {            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();    }}

這個工具類其實可以自己定,根據自己的業務去擴展Q7028資訊網——每日最新資訊28at.com

注解使用

@Datapublic class People {    private Integer id;    private String name;    private Integer sex;    private Integer age;    @PrivacyEncrypt(type = PrivacyTypeEnum.PHONE) // 隱藏手機號    private String phone;    @PrivacyEncrypt(type = PrivacyTypeEnum.EMAIL) // 隱藏郵箱    private String email;    private String sign;}

到這里,脫敏工作就已經結束了,全局使用這一個注解即可,一勞永逸,支持擴展,測試效果圖如下:Q7028資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-73791-0.html輕松實現 SpringBoot 中的隱私數據脫敏處理

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: NextTick 在 Vue 中如何發揮作用的?其實大部分人一知半解

下一篇: 做好設計:架構模式

標簽:
  • 熱門焦點
  • 鴻蒙OS 4.0公測機型公布:甚至連nova6都支持

    華為全新的HarmonyOS 4.0操作系統將于今天下午正式登場,官方在發布會之前也已經正式給出了可升級的機型產品,這意味著這些機型會率先支持升級享用。這次的HarmonyOS 4.0支持
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據博主數碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 得物寵物生意「狂飆」,發力“它經濟”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項。通過上傳自家寵物的部位細節,就能收獲擁有專業資質認證的得物鑒
  • 華為和江淮汽車合作開發百萬元問界MPV?雙方回應來了

    8月1日消息,郭明錤今天在社交平臺發文稱,華為正在和江淮汽車合作,開發售價在100萬元的問界MPV,預計在2024年第2季度量產,銷量目標為上市首年交付5萬輛。
  • 自研Exynos回歸!三星Galaxy S24系列將提供Exynos和驍龍雙版本

    年初,全新的三星Galaxy S23系列發布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三個版本,全系搭載超頻版驍龍8 Gen 2,雖同樣采用臺積電4nm工藝制
  • 半導體需求下滑 三星電子DS業務部門今年營業虧損預計超10萬億韓元

    7月17日消息,據外媒報道,去年下半年開始的半導體需求下滑,影響到了三星電子、SK海力士、英特爾等諸多廠商,營收明顯下滑,部分廠商甚至出現了虧損。作為
Top