java 日誌的資料脫敏

來源:互聯網
上載者:User

標籤:address   利弊   資料脫敏   idc   get   寫入   vat   color   @param   

思路 1。在 model層進行處理,直接重寫get方法,在寫一個getPlain 擷取明文方法。(缺點:資料庫寫入和json序列化傳遞時使用的都是密文)

  2.利用 日誌組件過濾 特定的key,去進行脫敏(缺點:對所有的日誌輸出全部要正則匹配,非常耗時。)

由1,2的利弊,肯定會選擇1,然後考慮一種實現(在model層定義方法,擷取它的一個複製類,複製類裡面的資訊都是脫敏的,日誌輸出時只輸出 複製對象),克服掉1的缺點  

1.定義介面類

public interface NoSensitiveObj<T> {    default T noSensitiveObj(){        return (T) this;    }}

2.實作類別 如果這個類沒有敏感資訊,只實現 NoSensitiveObj ,不需要實現裡面的方法

public class User implements NoSensitiveObj<User>{    private String name;        private String phone;        private String email;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPhone() {        return phone;    }    public void setPhone(String phone) {        this.phone = phone;    }    public String getEmail() {        return email;    }    public void setEmail(String email) {        this.email = email;    }    @Override    public User noSensitiveObj() {            User t;            t=new User();            t.setEmail(SensitiveInfoUtils.email(email));            t.setName(SensitiveInfoUtils.chineseName(name));            t.setPhone(SensitiveInfoUtils.mobilePhone(phone));        return t;    }    }

3.工具類

public class SensitiveInfoUtils {    /**     * [中文姓名] 只顯示第一個漢字,其他隱藏為2個星號<例子:李**>     */    public static String chineseName(final String fullName) {        if (StringUtils.isBlank(fullName)) {            return "";        }        final String name = StringUtils.left(fullName, 1);        return StringUtils.rightPad(name, StringUtils.length(fullName), "*");    }    /**     * [中文姓名] 只顯示第一個漢字,其他隱藏為2個星號<例子:李**>     */    public static String chineseName(final String familyName, final String givenName) {        if (StringUtils.isBlank(familyName) || StringUtils.isBlank(givenName)) {            return "";        }        return chineseName(familyName + givenName);    }    /**     * [社會安全號碼] 顯示最後四位,其他隱藏。共計18位或者15位。<例子:*************5762>     */    public static String idCardNum(final String id) {        if (StringUtils.isBlank(id)) {            return "";        }        return StringUtils.left(id, 3).concat(StringUtils                .removeStart(StringUtils.leftPad(StringUtils.right(id, 3), StringUtils.length(id), "*"), "***"));    }    /**     * [固定電話] 後四位,其他隱藏<例子:****1234>     */    public static String fixedPhone(final String num) {        if (StringUtils.isBlank(num)) {            return "";        }        return StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*");    }    /**     * [手機號碼] 前三位,後四位,其他隱藏<例子:138******1234>     */    public static String mobilePhone(final String num) {        if (StringUtils.isBlank(num)) {            return "";        }        return StringUtils.left(num, 2).concat(StringUtils                .removeStart(StringUtils.leftPad(StringUtils.right(num, 2), StringUtils.length(num), "*"), "***"));    }    /**     * [地址] 只顯示到地區,不顯示詳細地址;我們要對個人資訊增強保護<例子:北京市海澱區****>     *     * @param sensitiveSize     *            敏感資訊長度     */    public static String address(final String address, final int sensitiveSize) {        if (StringUtils.isBlank(address)) {            return "";        }        final int length = StringUtils.length(address);        return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");    }    /**     * [電子郵箱] 郵箱首碼僅顯示第一個字母,首碼其他隱藏,用星號代替,@及後面的地址顯示<例子:g**@163.com>     */    public static String email(final String email) {        if (StringUtils.isBlank(email)) {            return "";        }        final int index = StringUtils.indexOf(email, "@");        if (index <= 1) {            return email;        } else {            return StringUtils.rightPad(StringUtils.left(email, 1), index, "*")                    .concat(StringUtils.mid(email, index, StringUtils.length(email)));        }    }    /**     * [銀行卡號] 前六位,後四位,其他用星號隱藏每位1個星號<例子:6222600**********1234>     */    public static String bankCard(final String cardNum) {        if (StringUtils.isBlank(cardNum)) {            return "";        }        return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(                StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), "*"), "******"));    }    /**     * [公司開戶銀行聯號] 公司開戶銀行聯行號,顯示前兩位,其他用星號隱藏,每位1個星號<例子:12********>     */    public static String cnapsCode(final String code) {        if (StringUtils.isBlank(code)) {            return "";        }        return StringUtils.rightPad(StringUtils.left(code, 2), StringUtils.length(code), "*");    }}

 

4.測試

public class Test {    private static final Logger logger=LoggerFactory.getLogger(Test.class);        public static void main(String[] args) {        User user=new User();        user.setName("張三");        user.setPhone("18666218777");        user.setEmail("[email protected]");        System.out.println(JSON.toJSONString(user.noSensitiveObj()));            }}

結果

{"email":"z*******@qq.com","name":"張*","phone":"18******77"}

java 日誌的資料脫敏

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.