日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

針對大規模服務日志敏感信息的長效治理實踐

來源: 責編: 時間:2024-01-15 09:22:19 314觀看
導讀1 背景近年來,國家采取了多項重要舉措來加強個人數據保護,包括實施《中華人民共和國網絡安全法》和《個人信息保護法》等法律法規。這些舉措旨在確保用戶隱私的安全,同時確保企業合規運營。在處理敏感數據時,企業有責任采

1 背景

近年來,國家采取了多項重要舉措來加強個人數據保護,包括實施《中華人民共和國網絡安全法》和《個人信息保護法》等法律法規。這些舉措旨在確保用戶隱私的安全,同時確保企業合規運營。在處理敏感數據時,企業有責任采取適當的措施來保護用戶信息。jlh28資訊網——每日最新資訊28at.com

在數據保護方面,日志記錄成為一個需要特別關注的敏感信息領域。因此,本文將重點介紹轉轉在日志脫敏方面的應用與實踐。jlh28資訊網——每日最新資訊28at.com

2 目標與措施

目標:對日志內的手機號、身份證號、銀行卡號等敏感信息脫敏,建立一個可持續的日志敏感信息管控機制。jlh28資訊網——每日最新資訊28at.com

措施:jlh28資訊網——每日最新資訊28at.com

  1. 檢測和定位存在敏感日志的服務與CASE;
  2. 開發低接入成本的日志脫敏工具;
  3. 推動相關業務進行迭代修改;
  4. 長期監控和持續治理,確保日志安全。

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

我們的第一步是利用大數據離線掃描服務日志,并使用正則表達式匹配敏感信息。jlh28資訊網——每日最新資訊28at.com

然而,第二和第三步是挑戰的關鍵,即如何在不干擾業務正常迭代排期的情況下,推動大量服務的日志做脫敏。我們希望使用技術手段盡量降低業務日志脫敏的人力成本。jlh28資訊網——每日最新資訊28at.com

3 實施

參考《轉轉日志規范》查看標準日志輸出要求,在此基礎之上,提供一些工具輔助業務對日志脫敏。jlh28資訊網——每日最新資訊28at.com

【推薦】JavaBean類需實現toString()方法,日志直接打印對象,慎用JSON工具將對象轉換成String。jlh28資訊網——每日最新資訊28at.com

3.1 脫敏工具類

我們開發了脫敏工具類,期望業務同學在實現JavaBean toString()方法的同時,使用脫敏工具對敏感字段使用脫敏。jlh28資訊網——每日最新資訊28at.com

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

  • desensitize(String input):通用脫敏函數,支持對任意字符脫敏,將提取字符串中4位以上數字(如手機號、銀行卡號、身份證號、數字驗證碼等)做脫敏;
  • desensitizeByInputLength(String input):據字符串長度匹配不同的脫敏規則,如:11位則使用手機號脫敏規則,18位則使用身份證號脫敏規則;
  • desensitizePhoneNumber(String phoneNumber):脫敏手機號,前3位和后4位,中間的數字用*代替;
  • desensitizeIDCard(String idCard):脫敏身份證號, 保留前6位和后4位,脫敏7~15位生日信息, 用*代替;
  • desensitizeBankCardNumber(String bankCardNumber):脫敏銀行卡號, 前6位和后4位,中間的數字用*代替。
public final class DesensitizeUtil {            /**     * 根據字符串長度匹配不同的脫敏函數, 強制脫敏     */    public static String desensitizeByInputLength(String input) {        int length = input.length();        // 手機號        if (length == 11) {            return desensitizePhoneNumber(input);        }        // ,,,    }    /**     * 脫敏手機號, 前3位和后4位,中間的數字用*代替     */    public static String desensitizePhoneNumber(String phoneNumber) {        // 11位手機號        if (phoneNumber.length() == 11) {            return phoneNumber.substring(0, phoneNumber.length() - 8) + "****" + phoneNumber.substring(phoneNumber.length() - 4);        }        return phoneNumber;    }        // 省略其他脫敏函數...}

3.2 JSON脫敏

在某些日志記錄的場景中,會打印包含敏感字段的JSON格式的數據,需要對其中的敏感信息進行脫敏處理。jlh28資訊網——每日最新資訊28at.com

在常見的JSON工具中,比如Jackson,可以使用自定義的序列化器/反序列化器來實現脫敏。下面以Jackson為例進行說明:jlh28資訊網——每日最新資訊28at.com

首先,我們可以定義一個注解來標注哪些字段需要脫敏處理:jlh28資訊網——每日最新資訊28at.com

/** * 脫敏注解 */@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Desensitize { }

然后,我們可以創建一個自定義的Jackson模塊,通過繼承BeanSerializerModifier類來修改字段的序列化行為。在這個類中,我們可以根據字段上的Desensitize注解來判斷是否需要進行脫敏處理:jlh28資訊網——每日最新資訊28at.com

/** * Jackson脫敏序列化修改器 */public class JacksonDesensitizeSerializerModifier extends BeanSerializerModifier {    @Override    public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,                                                     List<BeanPropertyWriter> beanProperties) {        for (BeanPropertyWriter beanProperty : beanProperties) {            // 只針對使用了@Desensitize的字段做脫敏            Desensitize desensitize = beanProperty.getAnnotation(Desensitize.class);            if(desensitize != null) {                // 指定自定義的序列化器                beanProperty.assignSerializer(new Desensitization());            }        }        return beanProperties;    }    /**     * Jackson序列化器     */    public class Desensitization extends StdSerializer<Object> {        @Override        public final void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {            // 根據長度對字段做脫敏            String desensitize = DesensitizeUtil.desensitizeByInputLength(String.valueOf(value));            gen.writeString(desensitize);        }    }}

最后,我們需要注冊這個自定義的模塊到Jackson中jlh28資訊網——每日最新資訊28at.com

/** * JSON工具 */public class JsonUtil {    private static final ObjectMapper DESENSITIZE_OBJECT_MAPPER = newObjectMapper();    private static ObjectMapper newObjectMapper() {        ObjectMapper mapper = new ObjectMapper();        //增加脫敏序列化器        SimpleModule simpleModule = new SimpleModule("SimpleModuleDesensitize");        simpleModule.setSerializerModifier(new JacksonDesensitizeSerializerModifier());        mapper.registerModule(simpleModule);        return mapper;    }       /**    * 對象轉JSON的自動脫敏工具    */    public static <T> String object2DesensitizeString(T object) throws JsonProcessingException {        return DESENSITIZE_OBJECT_MAPPER.writeValueAsString(object);    }        //...}

對于業務同學而言,只需在需要脫敏的對象上添加脫敏注解,然后使用我們提供的JsonUtil進行脫敏操作,實現簡單高效。jlh28資訊網——每日最新資訊28at.com

/** * 需要脫敏的對象 */public class User {          /**     * 標記此字段需要脫敏     */    @Desensitize    private String mobile;    private String username;        //getter setter...}User user = new User();user.setAge(18);user.username = "zhangsan";user.password = "123456";JsonUtil.object2DesensitizeString(user);//輸出結果: {"mobile":"135****5555","username":"張三"}

注意:以上代碼只是一個示例,并不完整。在實際使用中,還需要根據具體的需求來靈活實現脫敏處理。jlh28資訊網——每日最新資訊28at.com

3.3 APT自動脫敏

在實際實施過程中,以上兩個方案遇到了很多阻礙。主要問題在于業務同學手動維護Bean的toString()方法過于繁瑣、重復工作多、容易遺漏對象并導致增加或刪除字段時需要不斷修改toString()函數。此外,業務服務所依賴的Bean來源復雜,有可能是其他業務提供的第二方Jar包或第三方Jar包。jlh28資訊網——每日最新資訊28at.com

因此,在實際應用中,業務同學更傾向于將Bean序列化為JSON并輸出到日志中,如下所示:jlh28資訊網——每日最新資訊28at.com

log.info("data={}", JsonUtil.object2DesensitizeString(bean));

然而,這種方法不符合《轉轉日志規范》要求,而且忽略了JSON序列化性能的問題。此外,這種方案也需要耗費大量的人力資源:需要評估每一行日志,以確定是否需要添加JSON脫敏功能。jlh28資訊網——每日最新資訊28at.com

因此,業務同學提出了以下需求:是否可以實現類似Lombok一樣的功能,只需在Bean的字段上添加脫敏注解,就能在編譯期自動實現脫敏后的toString()函數?這樣的話,在打印日志時直接打印對象即可自動脫敏。jlh28資訊網——每日最新資訊28at.com

經過調研發現,Lombok在編譯時利用APT(Annotation Processing Tools)生成代碼,實現了自動化的代碼生成過程,從而簡化了開發工作。jlh28資訊網——每日最新資訊28at.com

APT(Annotation Processing Tool)是Java的編譯期注解處理器。它允許開發人員在編譯期間處理注解,并根據注解和相關對象的信息生成Java代碼模板或配置文件等。jlh28資訊網——每日最新資訊28at.com

APT的使用可以提高程序性能,因為它在代碼編譯時完成注解處理,而不是在運行時使用反射方式處理注解。jlh28資訊網——每日最新資訊28at.com

著名的開源框架,如Lombok、MapStruct和AutoService等,也使用了類似的技術來優化代碼的生成和處理過程。jlh28資訊網——每日最新資訊28at.com

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

我們利用APT技術實現了這樣的功能:如果一個類沒有重寫Object.toString()方法,在編譯時會自動為該類生成一個脫敏后的toString()方法。這個自動生成的toString()方法能夠識別脫敏注解,并在生成的toString()方法內對敏感信息進行脫敏處理。jlh28資訊網——每日最新資訊28at.com

在Java編譯后的Class文件中,toString()方法可能來自三個來源:源代碼、轉轉APT處理、Lombok等。優先級為:源代碼 > 轉轉APT處理 > Lombok等其他APT。簡言之,我們的APT處理不會覆蓋源代碼中定義的toString()方法,但會覆蓋由Lombok生成的toString()方法。jlh28資訊網——每日最新資訊28at.com

比如,我們有以下源碼:jlh28資訊網——每日最新資訊28at.com

class User {    private String username;    /**     * 密碼,增加了脫敏注解     */    @Desensitize    private String password;}

在接入轉轉APT后,反編譯的Class文件如下:jlh28資訊網——每日最新資訊28at.com

class User {    private String username;    @Desensitize    private String password;    public String toString() {        StringJoiner sj = new StringJoiner(", ", "User[", "]");                if (this.username != null) {            sj.add("username=" + this.username);        }         if (this.password != null) {            sj.add("password=" + DesensitizeUtil.desensitizeByInputLength(value));        }         return sj.toString();    }}

測試如下:jlh28資訊網——每日最新資訊28at.com

User user = new User();user.username = "zhangsan";user.password = "123456";System.out.println(user);  //輸出結果: User[username=張三, password=1****6]

這個功能的上線大大降低了業務同學實現日志脫敏的工作量,只需為字段添加脫敏注解即可。同時,也解決了線上對象未重寫Object.toString()時打印日志的尷尬問題。jlh28資訊網——每日最新資訊28at.com

不過,在落地APT過程中,我們也遇到了一些問題,希望能給讀者提供一些有收益的參考。jlh28資訊網——每日最新資訊28at.com

3.3.1 本地緩存問題

在某個服務的Spring Bean上,有一個包含大量本地緩存的List字段,這個服務會打印Spring Bean對象到日志中。在引入轉轉APT之前,一切正常;但引入后,出現了頻繁的OOM問題。通過內存分析后發現,問題出在轉轉APT為Spring Bean自動生成的toString()函數內產生了大量的字符串上。jlh28資訊網——每日最新資訊28at.com

@Servicepublic class AppService {    /**     * 本地緩存     */    private List<Object> cache = new ArrayList<>();    }@Autowiredprivate AppService service;log.info("service={}", service);

我們觀察到大部分帶有本地緩存(或者高內存占用字段)的對象都是Spring的Bean,因此,我們對轉轉APT進行了修改:即不再為Spring Bean生成toString()函數。jlh28資訊網——每日最新資訊28at.com

3.3.2 JDK序列化問題

某個服務的JavaBean使用了原生JDK的序列化/反序列化工具,但是這個JavaBean卻沒有添加serialVersionUID。jlh28資訊網——每日最新資訊28at.com

class Person implements Serializable {    // 沒有定義serialVersionUID    // private static final long serialVersionUID = -55721300387280236L;}

Java序列化機制使用long型的serialVersionUID字段來標志類的版本號;序列化對象時,JVM會將serialVersionUID的值寫入序列化數據中;反序列化時,JVM會將序列化數據中的serialVersionUID與對應類中的serialVersionUID進行比較,若不同,則拋出InvalidCastException;若版本號相同,則能夠進行反序列化。jlh28資訊網——每日最新資訊28at.com

當一個類沒有顯式定義serialVersionUID時,JVM會自動根據類的信息計算生成一個默認的serialVersionUID。這樣,在類發生變化時,自動生成的serialVersionUID可能會改變,導致無法正確反序列化之前的數據。jlh28資訊網——每日最新資訊28at.com

引入轉轉APT后,由于自動生成了toString函數,類信息發生變化,導致serialVersionUID也發生了改變,進而導致反序列化失敗。jlh28資訊網——每日最新資訊28at.com

解決方式是將之前默認生成的serialVersionUID找到,并將其添加到類的源碼中。jlh28資訊網——每日最新資訊28at.com

3.4 棄用方案

還有一種快速落地的方法是,通過在應用程序內部統一攔截日志輸出,正則匹配敏感信息,并利用脫敏工具進行脫敏處理。jlh28資訊網——每日最新資訊28at.com

我們沒有使用這種方式的原因是因為:脫敏應盡量避免正則匹配,容易誤傷且性能低下。jlh28資訊網——每日最新資訊28at.com

4 規劃

上文提過,服務內依賴的Java Bean來源十分復雜,我們目前只解決了對象本身的脫敏問題。而對于服務依賴的Jar包版本控制,仍需要業務團隊梳理依賴關系,并手動修改脫敏后的Jar包版本,這一過程仍需要耗費較多的時間和人力。jlh28資訊網——每日最新資訊28at.com

考慮到這個問題,是否可以為每個服務提供一個依賴關系管控系統?該系統可以對Jar包的版本實現自動更新、自動化測試、灰度發布、自動發布和回滾等一系列功能。對于轉轉目前的情況來說,我相信這不是一個技術問題,而是一個需要更多時間來完善的TODO List。jlh28資訊網——每日最新資訊28at.com

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

5 總結

一個小小的功能日志脫敏,卻經歷了多個階段與挑戰,從敏感日志的發現到開發脫敏工具類,再到Json脫敏,再到APT脫敏,最終推動業務應用。核心的挑戰在于如何做好推動相關的工作?jlh28資訊網——每日最新資訊28at.com

我認為,推動相關工作的核心在于有效應對內在和外在的因素。然而,外部因素對推動的阻力常常更大,要成功推動工作,轉變外部阻力為內部動力至關重要。而對于推動者而言,換位思考、勇于挑戰未知、深入追根究底的打磨產品會使產品更容易被接受和推廣。jlh28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-61003-0.html針對大規模服務日志敏感信息的長效治理實踐

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

上一篇: vivo 海量微服務架構最新實踐

下一篇: Rust又被降本增效選中!Rust替代Python,亞馬遜云成本降為1/4!

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
一区二区三区不卡视频在线观看| 国产三级精品在线不卡| 欧美不卡在线| 免费日韩视频| 欧美视频精品一区| 国产亚洲一区精品| 亚洲电影专区| 日韩午夜av电影| 亚洲女人小视频在线观看| 久久久久久久欧美精品| 欧美激情综合色综合啪啪| 国产精品专区h在线观看| 在线观看国产精品淫| 99国产精品久久久久久久成人热| 香蕉久久精品日日躁夜夜躁| 美女视频网站黄色亚洲| 欧美视频在线观看视频极品| 国产亚洲一区在线| 亚洲日本中文字幕区| 午夜久久一区| 欧美国产综合| 国产一区二区三区四区五区美女| 亚洲精品一区在线观看香蕉| 小黄鸭精品密入口导航| 欧美精品一区二区三区一线天视频 | 国产亚洲精品激情久久| 亚洲人成网站精品片在线观看| 亚洲一级在线观看| 久久一区二区三区四区| 国产精品久久99| 久久精品国产综合| 欧美精品高清视频| 国产丝袜美腿一区二区三区| 9国产精品视频| 久久中文字幕导航| 国产啪精品视频| 一区二区三区偷拍| 免费在线成人| 国产在线精品成人一区二区三区| 一本久道综合久久精品| 免费久久久一本精品久久区| 国产欧美亚洲视频| 亚洲视频一区二区在线观看| 美女日韩在线中文字幕| 国产日韩一区二区三区在线播放| 一本色道综合亚洲| 欧美成人午夜激情视频| 国产在线视频欧美| 亚洲欧美不卡| 欧美三区在线视频| 亚洲精品免费在线| 美女主播一区| 激情久久久久久久| 欧美一区二区高清在线观看| 国产精品成人一区| 99国产一区| 欧美激情一区在线| 亚洲国产精品一区在线观看不卡 | 亚洲高清免费| 久久免费视频网站| 国产午夜一区二区三区| 亚洲自拍偷拍福利| 国产精品高清一区二区三区| 99re成人精品视频| 欧美精品一区二区三区高清aⅴ| 亚洲高清久久久| 米奇777在线欧美播放| 一区二区在线视频| 久久人人九九| 黄色在线成人| 久久深夜福利免费观看| 国产一区二区三区免费观看| 欧美一级久久| 国产日韩免费| 欧美专区日韩专区| 国产一区二区精品久久| 久久精品在线免费观看| 国产一区日韩二区欧美三区| 欧美综合国产| 韩国一区二区三区美女美女秀| 久久成人精品| 韩国在线视频一区| 久久久久久久久久久久久女国产乱| 国产亚洲成精品久久| 久久av二区| 激情欧美一区二区三区| 久久人人97超碰精品888| 尹人成人综合网| 蘑菇福利视频一区播放| 欧美性开放视频| 一区二区三区 在线观看视频| 欧美日韩国产精品一区二区亚洲| 日韩天天综合| 国产精品狼人久久影院观看方式| 亚洲伊人伊色伊影伊综合网| 国产精品视频不卡| 久久xxxx| 亚洲高清不卡在线| 欧美精品日韩www.p站| 一区二区三区日韩精品| 欧美视频中文一区二区三区在线观看 | 亚洲欧洲在线播放| 欧美日韩不卡合集视频| av成人免费在线观看| 国产精品hd| 午夜天堂精品久久久久| 国内外成人免费激情在线视频| 久久综合亚洲社区| 亚洲精品之草原avav久久| 欧美亚洲第一页| 久久不射2019中文字幕| 亚洲电影免费观看高清完整版在线 | 国产伦精品一区二区三区在线观看| 欧美影院成人| 亚洲国产精品国自产拍av秋霞| 欧美日韩国产综合新一区| 亚洲欧美精品在线| 影音先锋亚洲精品| 欧美日韩国产影片| 性欧美videos另类喷潮| 在线欧美福利| 欧美午夜精品久久久久久人妖| 午夜亚洲精品| 亚洲国产精品va在线看黑人| 国产精品大片| 久久综合亚州| 亚洲少妇最新在线视频| 国内精品模特av私拍在线观看| 欧美好吊妞视频| 欧美一级艳片视频免费观看| 亚洲韩日在线| 国产日产欧产精品推荐色| 欧美高清日韩| 欧美永久精品| 99re视频这里只有精品| 国产亚洲精品aa| 欧美日韩午夜激情| 久久久五月婷婷| 亚洲少妇自拍| 亚洲国产精品一区二区久| 国产精品亚洲产品| 欧美国产1区2区| 欧美亚洲一区二区三区| 亚洲精品视频在线看| 国产婷婷成人久久av免费高清| 欧美激情在线播放| 久久成人这里只有精品| 亚洲视频一区二区免费在线观看| 韩日视频一区| 国产精品人成在线观看免费 | 亚洲国产成人精品久久| 国产精品亚发布| 欧美精品一区二区三区一线天视频| 欧美怡红院视频| 亚洲香蕉在线观看| 亚洲日本欧美日韩高观看| 国产在线精品一区二区夜色| 欧美色区777第一页| 美女主播精品视频一二三四| 午夜精品久久久久久久99热浪潮| 亚洲精品国产精品国自产观看浪潮| 国产视频欧美视频| 欧美性片在线观看| 欧美激情中文字幕在线| 久久久久欧美精品| 欧美一区二区三区免费在线看| 一本一本久久a久久精品牛牛影视| 一区免费在线| 国产一区99| 国产精品区一区二区三区| 欧美精品激情| 免费永久网站黄欧美| 久久麻豆一区二区| 欧美在线免费视频| 亚洲中午字幕| 一区二区三区精品视频| 亚洲精品乱码视频| 亚洲高清色综合| 伊人久久婷婷色综合98网| 国产一区二区三区四区| 国产日本欧美在线观看| 国产精品久久久久久久久久久久 | 免费久久精品视频| 久久视频在线视频| 久久精品国产清自在天天线| 午夜激情综合网| 亚洲一区二区三区精品视频| 99天天综合性| 日韩一级网站| 亚洲免费精彩视频| 亚洲精品一区二区三| 亚洲茄子视频| 亚洲激情视频在线观看| 亚洲国产精品99久久久久久久久| 尹人成人综合网| 红桃视频一区| 一区二区亚洲精品| 有码中文亚洲精品| 樱桃成人精品视频在线播放| 伊甸园精品99久久久久久| 极品尤物一区二区三区| 一区免费视频| 91久久精品国产91性色| 亚洲国产一二三|