一种配置化的数据脱敏与反脱敏框架实现

这篇具有很好参考价值的文章主要介绍了一种配置化的数据脱敏与反脱敏框架实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.tony框架背景

  • 在业务量日益剧增的背景下,大量数据在各种业务活动中产生,数据安全控制一直是治理的重要环节,数据脱敏属于安全控制的范畴。对互联网公司来说,数据安全一直是极为重视和敏感的话题。数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。涉及客户安全数据或者一些商业性敏感数据,如身份证号、手机号、卡号、客户号等个人信息按照相关部门规定,都需要进行数据脱敏。

  • 在现有的微服务技术架构背景下,敏感数据的使用存在如下痛点:

    • 敏感数据与PC、APP客户端使用明文数据交互,数据安全无法保证。

    • 敏感数据浏览缺乏监控,无法针对性的做数据治理。

    • 微服务架构系统应用多而杂,期望引入一套通用的方案统一解决敏感数据安全问题。

基于以上痛点,tony提供了一套完整、安全、透明化、低改造成本的数据脱敏整合解决方案。

2.tony框架简介

Tony是一款敏感数据脱敏与浏览记录监控工具,可对系统中的敏感信息进行脱敏处理,并在泄漏时提供追溯依据,为企业数据共享、迁移、分发提供安全保护措施。该项目基于spring进行开发,提供spring-boot-starter启动包,接入简单,主要实现功能如下:

灵活的脱敏方案

业务系统的数据千变万化,为确保所有业务数据都能够正常进行敏感信息处理,数据脱敏提供高灵活性的自定义脱敏配置。通过丰富多样的脱敏规则定义,敏感数据处理可实现高度契合业务的脱敏处理。

统一的明文数据管理

框架内置敏感数据对应的明文数据管理流程,将明文数据统一缓存管理,提供统一的明文数据访问api。

浏览记录留痕

针对不同用户对敏感信息明文数据的浏览动作,接入方可以自定义日志格式模版记录输出到日志文件中,做到每条数据的浏览有迹可循。

异常浏览量预警

接入方通过自定义脱敏配置可以设置不同场景的敏感浏览明文数据量阈值,开启告警后,当用户访问明文数据次数到达阈值后,会触发预警流程,接入方可自定义预警逻辑。

tony整体架构:

tony-core模块定义了基本的脱敏功能实现,整体流程采用spi机制预留了充分的扩展空间。以tony-core为底座,集成汽车现有技术栈提供了tony-transformers模块对基础的脱敏功能进行了扩展:异步的缓存事件分发,分布式明文数据缓存,对接集团安全部门的敏感日志留痕,异常浏览量的邮件预警。

name desc
MaskAnnotationProcessor 业务场景代理,通过注解代理对应的脱敏场景方法。
IMaskProcess 数据脱敏处理器
IMaskLogProcessor 数据浏览日志处理器
IMaskCacheProcessor 明文数据缓存处理器
IMaskLimitProcessor 明文数据访问限额管理
IMaskWarningProcessor 异常浏览预警处理
IMaskContent 上下文信息处理器
IUnMaskProcessor 明文数据获取处理器
DefaultUnMaskProcessorAdapter 明文数据获取适配器,提供从缓存中获取明文数据功能。
DefaultMaskCacheProcess 明文数据缓存处理器,提供分布式缓存功能。
DefaultMaskContent 上下文信息处理器,提供ThreadLocal实现。
DefaultMaskWarningProcessor 异常浏览预警处理,提供邮件告警实现。
PlaintextProcess 明文属于获取接口约束,可自定义明文数据获取的扩展。
MaskMonitorCacheHandle 缓存时间消费,异步消费缓存事件,存储明文数据。

tony处理流程详解:

tony和业务代码部署在一起,接入应用通过脱敏场景与脱敏配置项的指定来实现对应业务场景的脱敏代理。业务代码只需配置场景注解即可兼容使用。此时敏感数据的脱敏工作由tony负责,tony会拦截业务场景的响应数据,对敏感信息进行脱敏处理。

tony脱敏配置详解:

脱敏配置主要分为四部分:脱敏上下文配置,脱敏场景配置,脱敏预警配置以及日志留痕模版,其详情如下图所示:

key name desc
tony.appName 接入系统名称
tony.maskSourceName 脱敏白名单 控制统一场景的接口对不同调用方进行数据是否脱敏控制
tony.mask.XXX 脱敏场景 XXX为具体场景的key
tony.mask.XXX.enable 动态开关 控制是否开启脱敏
tony.mask.XXX.limits 明文浏览限额 限制明文浏览次数
tony.mask.XXX.cacheKey 数据缓存解析规则 示例:STATEMENT_BILL_PAGE:${argItem.id}
tony.types.YYY 脱敏字段 YYY为具体字段的key
tony.types.YYY.regex 脱敏规则配置 脱敏的正则表达式 示例:(\d{3})\d{4}(\d{4})
tony.types.YYY.replacement 脱敏规则配置 脱敏的正则表达式 示例:$1****$2
tony.types.YYY.logName 日志字段名称

3. 系统详细设计

3.1 详细设计

3.1.1 活动图

3.1.2 时序图

3.1.3 类图

职责
com.jd.car.tony.annoation 注解层 负责声明要被代理的业务操作。
com.jd.car.tony.limit 负责记录敏感数据的访问次数,并提供预警。
com.jd.car.tony.mask 管理基础配置,并根据配置进行敏感数据遮盖脱敏。
com.jd.car.tony.log 记录敏感数据的访问操作,输出统一格式的日志信息。
com.jd.car.tony.unmask 提供敏感数据的明文信息查看功能。
com.jd.car.tony.support util包,负责全局功能的支持。

4. 接入使用

4.1 引入坐标

			<dependency>
                <groupId>com.jd.car</groupId>
                <artifactId>tony-spring-boot-starter</artifactId>
                <version>1.8-RELEASE</version>
            </dependency>



4.2 yaml配置

tony:
  appName: "appName"
  #鉴权信息key
  sessionName: ""
  systemName: "systemName"
  warningName: "XXX"
  #脱敏白名单
  maskSourceName: ""
  types:
    name:
      regex: "([\\u4e00-\\u9fa5a-z0-9]{1})[\\u4e00-\\u9fa5a-z0-9]+"
      replacement: "$1**"
      logName: "accountName"
  mask:
    order:
      enable: true
      limits: 100
      limitError: false
      cacheKey: "order:${argItem.id}"
      menuName: "场景名称"
      name: "order"
      #日志记录操作类型
      maskLogOp: ""
      maskLogAccountType: 3
      
   #预警邮箱设置
   mail:
    mailHost: 
    mailPort: 
    mailUser: 
    mailPwd: 
    mailFrom: 
    mailTo: 
    copyto: 
    sendFlag: 
    
 #异步事件缓存明文数据配置,分布式缓存
 jd:
  cache:
    jimdb:
      enable: false
      url: ''
  event:
    enable: true
    queue:
      # 自定义queue名字,例如monitorQueue
      maskMonitorQueue:
        retryCount: 3
        maxBakSize: 1000
        # monitorHandle 处理事件的beanName
        handlerBean: maskMonitorCacheHandle 



4.3 日志文件配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <contextName>demo</contextName>
    <!-- 日志最大的历史 单位:天 -->
    <property name="maxHistory" value="90"/>

    <property name="LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8:00} -%5p ${PID:- } --- [%X{PFTID}][%t] %-40.40logger{39}[%L] : %m%n"/>

    <property name="LOG_CHARSET" value="UTF-8"/>

    <property name="LOG_DES_PATTERN" value="%msg%n" />

    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <property name="LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8:00} -%5p ${PID:- } --- [%X{PFTID}][%t] %-40.40logger{39}[%L] : %m%n"/>

    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%X{PFTID}][%15.15t]){faint} %clr(%-40.40logger{39}[%L]){cyan} %clr(:){faint} %m%n}"/>


    <appender name="mask" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/today_log/mask.log</file>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/history_logs/mask-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <charset>${LOG_CHARSET}</charset>
            <pattern>${LOG_DES_PATTERN}</pattern>
        </encoder>
    </appender>
    <logger name="com.jd.car.tony.log.DefaultMaskLogProcessor" additivity="false">
        <level value="INFO" />
        <appender-ref ref="mask" />
    </logger>

</configuration>



4.3 场景接入

 /**
     * 测试脱敏
     *
     * @return
     */
    @RequestMapping("test")
    @MaskMethod("order")
    public DemoResult test(AuthInfoBO authInfo) {
        return new DemoResult();
    }

    /**
     * 测试脱敏
     *
     * @return
     */
    @RequestMapping("test-list")
    @MaskMethod("order")
    public List<DemoResult> testList(AuthInfoBO authInfo) {
        List<DemoResult> objects = Lists.newArrayList();
        objects.add(new DemoResult());
        objects.add(new DemoResult());
        return objects;
    }

 		@Autowired
    private IUnMaskProcessor unMaskProcessorProxy;

    /**
     * 测试反脱敏
     *
     * @return
     */
    @RequestMapping("unmask")
    public Map testUnMask(@RequestBody UnMaskRequest unMaskRequest, AuthInfoBO authInfo) {
        return unMaskProcessorProxy.unMask(unMaskRequest, authInfo);
    }



4.3 脱敏字段配置

@Data
public class DemoResult {

    @Mask(type = "name")
    private String userName = "jajajaasjcij";

    @Mask(type = "phone")
    private String userTel = "18911112222";

    private Long orderId = 1L;

}



4.4 业务监控

业务监控点 触发逻辑
敏感数据明文查看 单账号、单日、单接口访问次数到达访问限额时,则发送邮件给权限管理人员。
敏感数据查询日志 敏感数据脱敏后、明文数据查看时,按集团要求格式单独记录到日志文件中。

作者:京东零售 邱新达

来源:京东云开发者社区文章来源地址https://www.toymoban.com/news/detail-604944.html

到了这里,关于一种配置化的数据脱敏与反脱敏框架实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 实现数据脱敏的技术方案

    数据脱敏是保护个人隐私的一种重要手段,它通过对敏感信息进行处理,将敏感信息转换为不敏感的信息,以保护个人隐私不被泄漏。在Java中,数据脱敏也是一项非常重要的技术,本文将从数据脱敏的概念、Java中的数据脱敏原理、Java中的数据脱敏方法以及如何实现数据脱敏

    2024年02月08日
    浏览(43)
  • MyBatis拦截器优雅实现数据脱敏

    现代网络环境中,敏感数据的处理是至关重要的。敏感数据包括个人身份信息、银行账号、手机号码等,泄露这些数据可能导致用户隐私泄露、财产损失等严重后果。因此,对敏感数据进行脱敏处理是一种必要的安全措施。 比如页面上常见的敏感数据都是加*遮挡处理过的,

    2024年02月06日
    浏览(35)
  • 金融用户敏感数据如何优雅地实现脱敏?

    日志脱敏是常见的安全需求。普通的基于工具类方法的方式,对代码的入侵性太强,编写起来又特别麻烦。 sensitive 提供了基于注解的方式,并且内置了常见的脱敏方式,便于开发。 为了金融交易的安全性,国家强制规定对于以下信息是要日志脱敏的: 用户名 手机号 邮箱

    2024年02月07日
    浏览(26)
  • SpringBoot中优雅的实现隐私数据脱敏(提供Gitee源码)

    前言:在实际项目开发中,可能会对一些用户的隐私信息进行脱敏操作,传统的方式很多都是用replace方法进行手动替换,这样会由很多冗余的代码并且后续也不好维护,本期就讲解一下如何在SpringBoot中优雅的通过序列化的方式去实现数据的脱敏操作! 目录 一、导入pom依赖

    2024年02月12日
    浏览(28)
  • 【数据脱敏方案】不使用 AOP + 注解,使用 SpringBoot+YAML 实现

    在项目中遇到一个需求,需要对交易接口返回结果中的指定字段进行脱敏操作,但又不能使用 AOP+注解 的形式,于是决定使用一种比较笨的方法: 首先将所有需要脱敏字段及其对应脱敏规则存储到 Map 中。 在接口返回时,遍历结果中的所有字段,判断字段名在 Map 中是否存在

    2024年03月15日
    浏览(78)
  • SpringBoot中通过自定义Jackson注解实现接口返回数据脱敏

    SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文,查询明文: SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文,查询明文_霸道流氓气质的博客-CSDN博客 上面讲的是数据库中存储密文,查询时使用明文的脱敏方式,如果是需要数据库中存储 明文

    2024年02月16日
    浏览(34)
  • SpringBoot利用自定义json序列化器实现敏感字段数据脱敏

    物料准备: 1.hutool依赖 2.自定义的jackson序列化器 3.测试@JsonSerialize效果 因为案例代码用到了hutool提供的DesensitizedUtil数据脱敏工具类,这里要引入hutool的依赖。 如果你需要自定义 数据脱敏的逻辑,可以不引入这个依赖 自定义一个手机号脱敏序列化器 自定义一个邮箱脱敏序列化

    2024年02月12日
    浏览(57)
  • 一种基于闭包函数实现自动化框架断言组件的设计实践

    目前测试组同学基本具备自动化脚本编写能力,为了提高效率,如何灵活运用这些维护的脚本去替代部分手工的重复工作?为了达到测试过程中更多的去使用自动化方式,如何能够保证通过脚本覆盖更多的校验点,提高自动化测试的精度和力度?那么一定是不断的丰富断言,

    2024年02月08日
    浏览(49)
  • 网络爬虫(Python:Selenium、Scrapy框架;爬虫与反爬虫笔记)

    Selenium是一个模拟浏览器浏览网页的工具,主要用于测试网站的自动化测试工具。 Selenium需要安装浏览器驱动,才能调用浏览器进行自动爬取或自动化测试,常见的包括Chrome、Firefox、IE、PhantomJS等浏览器。 注意:驱动下载解压后,置于Python的安装目录下;然后将Python的安装目

    2024年01月18日
    浏览(46)
  • SpringBoot配置文件脱敏

    SpringBoot集成Jasypt配置很简单,只需引入依赖,然后配置Jasypt相关属性参数即可: ● Maven ● 生成密文 ● 配置加解密bean ● 注册加解密bean ● 生成密文 ● 配置文件加密 密文使用ENC()包裹 ● 启动应用时,配置系统属性,idea配置VM选项

    2024年02月13日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包