tokenpocket官网app下载地址在这|数据脱敏工具

作者: tokenpocket官网app下载地址在这
2024-03-08 03:26:14

有没有开源的数据脱敏工具,java,从互联网找到的基本上是商用的产品。开源社区有吗? - 知乎

有没有开源的数据脱敏工具,java,从互联网找到的基本上是商用的产品。开源社区有吗? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册数据数据分析算法与数据结构大数据有没有开源的数据脱敏工具,java,从互联网找到的基本上是商用的产品。开源社区有吗?目前在做轻量级的数据脱敏,求解!显示全部 ​关注者16被浏览15,849关注问题​写回答​邀请回答​好问题​添加评论​分享​2 个回答默认排序Amy​ 关注我最近也在找Java开源的脱敏工具库,发现有一个库挺轻量级的,零配置,直接拿来即可用了,使用文档也较为清晰,值得尝试一下顺便贴一下工具库中的介绍:支持13种类型数据的脱敏,例如:邮箱地址、手机号、身份证、银行卡、车牌号、姓名、家庭地址、ip地址、生日、密码等配置灵活,同时支持全局脱敏和局部脱敏任意对象都可以被脱敏支持jsonpath表达式,可灵活控制同一个对象不同层级关系时既要脱敏又要不脱敏的场景工具库及使用文档地址:applesline/desensitize发布于 2022-01-21 23:50​赞同 5​​4 条评论​分享​收藏​喜欢收起​Blacard惯于吃饱等饿​ 关注github上还是蛮多的吧,我自己最近写了一个工具类。看是否适合你使用https://github.com/Heiffeng/sensitive-util发布于 2021-11-01 10:53​赞同​​添加评论​分享​收藏​喜欢收起​​

数据脱敏的 3 种常见方案,好用到爆!-腾讯云开发者社区-腾讯云

的 3 种常见方案,好用到爆!-腾讯云开发者社区-腾讯云郑子铭数据脱敏的 3 种常见方案,好用到爆!关注作者腾讯云开发者社区文档建议反馈控制台首页学习活动专区工具TVP最新优惠活动文章/答案/技术大牛搜索搜索关闭发布登录/注册首页学习活动专区工具TVP最新优惠活动返回腾讯云官网郑子铭首页学习活动专区工具TVP最新优惠活动返回腾讯云官网社区首页 >专栏 >数据脱敏的 3 种常见方案,好用到爆!数据脱敏的 3 种常见方案,好用到爆!郑子铭关注发布于 2024-03-06 17:48:34490发布于 2024-03-06 17:48:34举报文章被收录于专栏:DotNet NB && CloudNativeDotNet NB && CloudNative1.SQL数据脱敏实MYSQL(电话号码,身份证)数据脱敏的实现-- CONCAT()、LEFT()和RIGHT()字符串函数组合使用,请看下面具体实现

-- CONCAT(str1,str2,…):返回结果为连接参数产生的字符串

-- LEFT(str,len):返回从字符串str 开始的len 最左字符

-- RIGHT(str,len):从字符串str 开始,返回最右len 字符

-- 电话号码脱敏sql:

SELECT mobilePhone AS 脱敏前电话号码,CONCAT(LEFT(mobilePhone,3), '********' ) AS 脱敏后电话号码 FROM t_s_user

-- 身份证号码脱敏sql:

SELECT idcard AS 未脱敏身份证, CONCAT(LEFT(idcard,3), '****' ,RIGHT(idcard,4)) AS 脱敏后身份证号 FROM t_s_user

复制2.JAVA数据脱敏实现可参考:海强 / sensitive-plushttps://gitee.com/strong_sea/sensitive-plus数据脱敏插件,目前支持地址脱敏、银行卡号脱敏、中文姓名脱敏、固话脱敏、身份证号脱敏、手机号脱敏、密码脱敏 一个是正则脱敏、另外一个根据显示长度脱敏,默认是正则脱敏,可以根据自己的需要配置自己的规则。3.mybatis-mate-sensitive-jacksonmybatisplus 新发布,可以测试使用,生产需要收费。根据定义的策略类型,对数据进行脱敏,当然策略可以自定义。# 目前已有

package mybatis.mate.strategy;

public interface SensitiveType {

String chineseName = "chineseName";

String idCard = "idCard";

String phone = "phone";

String mobile = "mobile";

String address = "address";

String email = "email";

String bankCard = "bankCard";

String password = "password";

String carNumber = "carNumber";

}

复制Demo 代码目录1、pom.xml

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

com.baomidou

mybatis-mate-examples

0.0.1-SNAPSHOT

4.0.0

mybatis-mate-sensitive-jackson

mysql

mysql-connector-java

复制2、appliation.yml# DataSource Config

spring:

datasource:

# driver-class-name: org.h2.Driver

# schema: classpath:db/schema-h2.sql

# data: classpath:db/data-h2.sql

# url: jdbc:h2:mem:test

# username: root

# password: test

driver-class-name: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://localhost:3306/mybatis_mate?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

username: root

password: 123456

# Mybatis Mate 配置

mybatis-mate:

cert:

# 请添加微信wx153666购买授权,不白嫖从我做起! 测试证书会失效,请勿正式环境使用

grant: thisIsTestLicense

license: as/bsBaSVrsA9FfjC/N77ruEt2/QZDrW+MHETNuEuZBra5mlaXZU+DE1ZvF8UjzlLCpH3TFVH3WPV+Ya7Ugiz1Rx4wSh/FK6Ug9lhos7rnsNaRB/+mR30aXqtlLt4dAmLAOCT56r9mikW+t1DDJY8TVhERWMjEipbqGO9oe1fqYCegCEX8tVCpToKr5J1g1V86mNsNnEGXujnLlEw9jBTrGxAyQroD7Ns1Dhwz1K4Y188mvmRQp9t7OYrpgsC7N9CXq1s1c2GtvfItHArkqHE4oDrhaPjpbMjFWLI5/XqZDtW3D+AVcH7pTcYZn6vzFfDZEmfDFV5fQlT3Rc+GENEg==

# Logger Config

logging:

level:

mybatis.mate: debug

复制3、Appliation启动类package mybatis.mate.sensitive.jackson;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class SensitiveJacksonApplication {

// 测试访问 http://localhost:8080/info ,http://localhost:8080/list

public static void main(String[] args) {

SpringApplication.run(SensitiveJacksonApplication.class, args);

}

}

复制4、配置类,自定义脱敏策略package mybatis.mate.sensitive.jackson.config;

import mybatis.mate.databind.ISensitiveStrategy;

import mybatis.mate.strategy.SensitiveStrategy;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class SensitiveStrategyConfig {

/**

* 注入脱敏策略

*/

@Bean

public ISensitiveStrategy sensitiveStrategy() {

// 自定义 testStrategy 类型脱敏处理

return new SensitiveStrategy().addStrategy("testStrategy", t -> t + "***test***");

}

}

复制5、业务类User,注解标识脱敏字段,及选用脱敏策略package mybatis.mate.sensitive.jackson.entity;

import lombok.Getter;

import lombok.Setter;

import mybatis.mate.annotation.FieldSensitive;

import mybatis.mate.sensitive.jackson.config.SensitiveStrategyConfig;

import mybatis.mate.strategy.SensitiveType;

@Getter

@Setter

public class User {

private Long id;

/**

* 这里是一个自定义的策略 {@link SensitiveStrategyConfig} 初始化注入

*/

@FieldSensitive("testStrategy")

private String username;

/**

* 默认支持策略 {@link SensitiveType }

*/

@FieldSensitive(SensitiveType.mobile)

private String mobile;

@FieldSensitive(SensitiveType.email)

private String email;

}

复制UserControllerpackage mybatis.mate.sensitive.jackson.controller;

import mybatis.mate.databind.ISensitiveStrategy;

import mybatis.mate.databind.RequestDataTransfer;

import mybatis.mate.sensitive.jackson.entity.User;

import mybatis.mate.sensitive.jackson.mapper.UserMapper;

import mybatis.mate.strategy.SensitiveType;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

@RestController

public class UserController {

@Autowired

private UserMapper userMapper;

@Autowired

private ISensitiveStrategy sensitiveStrategy;

// 测试访问 http://localhost:8080/info

@GetMapping("/info")

public User info() {

return userMapper.selectById(1L);

}

// 测试返回 map 访问 http://localhost:8080/map

@GetMapping("/map")

public Map map() {

// 测试嵌套对象脱敏

Map userMap = new HashMap<>();

userMap.put("user", userMapper.selectById(1L));

userMap.put("test", 123);

userMap.put("userMap", new HashMap() {{

put("user2", userMapper.selectById(2L));

put("test2", "hi china");

}});

// 手动调用策略脱敏

userMap.put("mobile", sensitiveStrategy.getStrategyFunctionMap()

.get(SensitiveType.mobile).apply("15315388888"));

return userMap;

}

// 测试访问 http://localhost:8080/list

// 不脱敏 http://localhost:8080/list?skip=1

@GetMapping("/list")

public List list(HttpServletRequest request) {

if ("1".equals(request.getParameter("skip"))) {

// 跳过脱密处理

RequestDataTransfer.skipSensitive();

}

return userMapper.selectList(null);

}

}

复制UserMapperpackage mybatis.mate.sensitive.jackson.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import mybatis.mate.sensitive.jackson.entity.User;

import org.apache.ibatis.annotations.Mapper;

@Mapper

public interface UserMapper extends BaseMapper {

}

复制6、测试GET http://localhost:8080/list[

{

"id": 1,

"username": "Jone***test***",

"mobile": "153******81",

"email": "t****@baomidou.com"

},

{

"id": 2,

"username": "Jack***test***",

"mobile": "153******82",

"email": "t****@baomidou.com"

},

{

"id": 3,

"username": "Tom***test***",

"mobile": "153******83",

"email": "t****@baomidou.com"

}

]

复制GET http://localhost:8080/list?skip=1[

{

"id": 1,

"username": "Jone",

"mobile": "15315388881",

"email": "test1@baomidou.com"

},

{

"id": 2,

"username": "Jack",

"mobile": "15315388882",

"email": "test2@baomidou.com"

},

{

"id": 3,

"username": "Tom",

"mobile": "15315388883",

"email": "test3@baomidou.com"

}

]复制本文参与 腾讯云自媒体分享计划,分享自微信公众号。原始发表:2024-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除数据脱敏import测试配置字符串本文分享自 DotNet NB 微信公众号,前往查看如有侵权,请联系 cloudcommunity@tencent.com 删除。本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!数据脱敏import测试配置字符串评论登录后参与评论0 条评论热度最新登录 后参与评论推荐阅读LV.关注文章0获赞0相关产品与服务数据脱敏数据脱敏(Data Masking,DMask)是一款敏感数据脱敏与水印标记工具,可对数据系统中的敏感信息进行脱敏处理并在泄漏时提供追溯依据,为企业数据共享、迁移、分发提供安全保护措施。产品介绍产品文档2024新春采购节领券社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于社区规范免责声明联系我们友情链接腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569腾讯云计算(北京)有限责任公司 京ICP证150476号 |  京ICP备11018762号 | 京公网安备号11010802020287问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档Copyright © 2013 - 2024 Tencent Cloud.All Rights Reserved. 腾讯云 版权所有登录 后参与评论00

数据脱敏的处理方法及查询 - 知乎

数据脱敏的处理方法及查询 - 知乎切换模式写文章登录/注册数据脱敏的处理方法及查询润乾创新技术推动应用进步【摘要】 关键词:集算器、SPL、数据脱敏、报表 1)、数据脱敏是“指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。是数据库安全技术之一。” 2)、本文介绍的脱敏数据报表查询将利用润乾集算器编写 SPL 脚本,对敏感信息字段 (如: 姓名、证件号、银行账户、住址、电话号码、企业名称、工商注册号、纳税人识别号) 等通过预定义的脱敏规则进行数据脱敏、变形,实现敏感隐私数据的保护。 3)、润乾集算器能使脱敏工作变得的简单易行,同时可以减少大量重复性工作。通过集算器 SPL 脚本实现的脱敏数据,可直接作为报表数据集进行查询分析,也可以作为开发、测试和其它非生产环境或外包环境下的真实数据集使用。数据脱敏的处理方法及查询1.1 数据脱敏介绍根据百度词条的解释,数据脱敏是“指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。是数据库安全技术之一,数据库安全技术主要包括:数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。”随着信息时代的发展,我们对数据信息的安全要求越来越重视,比如对非生产环境下的敏感数据的脱敏保护。在金融、运营商、政府、能源等部门,非生产环境下数据脱敏已列入监管部门的法规要求。非生产环境数据多用于开发、测试、培训以及第三方数据分析、挖掘,如果不能有效实施敏感数据保护,极易造成敏感数据的泄露。所以,保证非生产数据的安全已经成为一个重要的课题,要求我们能够通过对敏感信息进行脱敏、变形,实现有效的数据保护。1.2 对数据脱敏工具的要求数据脱敏工具应该具有对多种异构数据源的支持,从而将一个脱敏规则应用于不同的数据源,比如针对“客户名称”字段的修改,脱敏规则基本一致,所以应该可以在 Excel、TXT、Oracle、MS SQLServer、MySQL、Hadoop 等数据源上直接引用。另外,工具还应支持将脱敏数据完全不落地分发,提供文件到文件、文件到数据库、数据库到数据库、数据库到文件等方式,并且不需要在生产系统或本地安装任何客户端。本文介绍的脱敏数据报表查询将利用润乾集算器编写 SPL 脚本,对敏感信息字段 ( 如: 姓名、证件号、银行账户、住址、电话号码、企业名称、工商注册号、纳税人识别号) 等通过预定义的脱敏规则进行数据脱敏、变形,实现敏感隐私数据的保护。润乾集算器能使脱敏工作变得的简单易行,同时可以减少大量重复性工作。通过集算器 SPL 脚本实现的脱敏数据,可直接作为报表数据集进行查询分析,也可以作为开发、测试和其它非生产环境或外包环境下的真实数据集使用。1.3 脱敏数据的特征数据脱敏不仅要执行数据漂白,抹去数据中的敏感内容,同时也需要保持原有的数据特征、业务规则和数据关联性,保证开发、测试、培训以及大数据类业务不会受到脱敏的影响,达成脱敏前后的数据一致性和有效性:l 保持原有数据特征数据脱敏前后必须保证数据特征的保持,例如:身份证号码由十七位数字本体码和一位校验码组成,分别为区域地址码(6 位)、出生日期(8 位)、顺序码(3 位)和校验码(1 位)。那么身份证号码的脱敏规就需要保证脱敏后依旧保持这些特征信息。l 保持数据之间的一致性在不同业务中,数据和数据之间具有一定的关联性。例如:出生年月或年龄和出生日期之间的关系。同样,身份证信息脱敏后仍需要保证出生年月字段和身份证中包含的出生日期之间的一致性。l 保持业务规则的关联性保持数据业务规则的关联性是指数据脱敏时数据关联性以及业务语义等保持不变,其中数据关联性包括:主、外键关联性、关联字段的业务语义关联性等。特别是高度敏感的账户类主体数据往往会贯穿主体的所有关系和行为信息,因此需要特别注意保证所有相关主体信息的一致性。l 多次脱敏之间的数据一致性相同的数据进行多次脱敏,或者在不同的测试系统进行脱敏,需要确保每次脱敏的数据始终保持一致性,只有这样才能保障业务系统数据变更的持续一致性以及广义业务的持续一致性。1.4 数据脱敏应用场景一般常见的数据脱敏场景,是将生产数据或是生产数据文件按照脱敏规则,将数据不落地脱敏至测试数据库或是测试数据文件中,具体如下所示:使用集算器的 SPL 可以按照业务场景要求自行定义和编写脱敏规则,比如针对上面的人员信息:姓名、身份证号、地址、电话号码、卡号等进行不落地脱敏,满足数据脱敏需要。集算器是一个无框架,可快速部署开发的数据计算中间件工具,能够直接运行编写好的 SPL 数据脱敏脚本即时进行数据脱敏,支持各种常见的数据脱敏的处理方式,包括数据替换、无效化、随机化、偏移和取整、掩码屏蔽、灵活编码等,本文介绍的数据脱敏方法都可以在实际应用中混合替换使用。本文中应用场景的数据脱敏都是基于下表数据内容进行的,数据存储在“数据脱敏验证表.txt”文件中。1.4.1 数据替换数据脱敏要求:用设置的固定虚构值替换真值。例如将手机号码统一替换为 13800013800。使用集算器 SPL 编码实现的脚本,如下: A1:导入“数据脱敏验证表”的文本数据。手机号码脱敏前的显示值如下:A2:将手机号码统一数据替换。直接使用run()函数对 mobile 手机号码字段数据进行赋值替换为13800013800。数据替换后,手机号码脱敏后的显示值如下:1.4.2 无效化数据脱敏要求:通过对数据值得截断、加密、隐藏等方式使敏感数据脱敏,使其不再具有利用价值,例如将地址以 ****** 代替真值。数据无效化与数据替换所达成的效果基本类似。使用集算器 SPL 编码实现的脚本,如下: A1:导入“数据脱敏验证表”的文本数据。地址脱敏前显示值如下:A2:将地址进行数据隐藏式的无效化脱敏。直接使用run()函数对 address 地址字段数据进行无效化的 ****** 处理。数据无效化后,地址脱敏后的显示值如下:A3:将地址进行数据截断式的无效化脱敏。使用left()函数对 address 地址源字符串的左边三位字串加上 ****** 的截断无效化处理。截断无效化的地址脱敏后显示值如下:1.4.3 随机化数据脱敏要求:采用随机数据代替真值,保持替换值的随机性以模拟样本的真实性。例如用随机生成的姓和名代替真值。使用集算器 SPL 编码实现的脚本,如下: A1:导入外部姓名字典表,用于随机化替换姓名真值。此处需特别注意一下,由于“姓氏”和“名字”文本数据都是单列数据表,在使用import()函数时需要增加 @i 选项,@i 表示文本数据只有1列时返回成序列,在单元格 A3 中可以直接位置获取随机值。A2:导入“数据脱敏验证表”的文本数据。姓名脱敏前显示值如下:A3:将姓名进行随机化脱敏。直接使用run()函数对 name 姓名进行随机化,使用rand()函数从“姓氏.txt”和“名字.txt”外部字典表随机化组合生成姓名。随机化后姓名的显示值如下:【注意】这个例子中我们针对数据脱敏引入了外部字典表,实际情况中可以根据数据脱敏要求,随时引入任意外部字典表,通过数据的随机化组合,实现替换真值数据的脱敏处理。1.4.4 偏移和取整数据脱敏要求:通过随机移位改变数字数据,例如日期 2018-01-02 8:12:25 变为 2018-01-02 8:00:00,偏移取整在保持了数据的安全性的同时保证了范围的大致真实性,此项功能在大数据利用环境中具有重大价值。使用集算器 SPL 编码实现的脚本,如下: A1:导入“数据脱敏验证表”的文本数据。操作日期脱敏前显示值如下:A2:将操作日期进行时间的偏移和取整脱敏。使用使用string()函数按照偏移和取整规则格式化成“yyyy-MM-dd HH:00:00”格式,操作时间脱敏后的显示值如下:【注意】脱敏后的日期时间保持了原有的数据特征,方便脱敏数据的后续使用。1.4.5 掩码屏蔽数据脱敏要求:掩码屏蔽是针对账户类数据的部分信息进行脱敏时的有力工具,比如银行卡号或是身份证号的脱敏。使用集算器 SPL 编码实现的脚本,如下: A1:导入“数据脱敏验证表”的文本数据。身份证号脱敏前显示值如下:A2:将身份证号的出生日期进行掩码屏蔽脱敏。使用left()函数截取身份证号的左边 6 位 + 字符串 ********+right()函数截取身份证号右边 4 位替换源身份证字符串,身份证号码脱敏后的显示值如下:1.4.6 灵活编码数据脱敏要求:在需要特殊脱敏规则时,可执行灵活编码以满足各种可能的脱敏规则。比如用固定字母和固定位数的数字替代合同编号真值。使用集算器 SPL 编码实现的脚本,如下:A1:导入“数据脱敏验证表”的文本数据。合同编号脱敏前显示值如下:A2:将合同编号进行自定义编码脱敏。自定义编码规则:4 位固定码 + 当前年份 + 源目标字符串 4 位号码 +9 位数值组成,使用的函数已有介绍,不再赘述,合同编号脱敏后显示值如下:1.4.7 脱敏数据的分发集算器 SPL 支持文件到文件、文件到数据库、数据库到数据库、数据库到文件的脱敏数据分发。下面分别进行具体说明:1.4.7.1 文本分发到文本使用集算器 SPL 编码实现的文本分发到文本的脚本如下: A1-B1:引入外部字典表“姓氏”和“名字”的文本数据,用于随机组合生成姓名信息。A2:使用游标导入大数据量的“数据脱敏验证表”文本数据。A3:按照脱敏规则进行数据表脱敏。A4:直接将脱敏的数据导出到文本文件。使用export()函数导出脱敏数据,其中,其中 @t 指定将第一行记录作为字段名, 如果不使用 @t 选项就会以 _1,_2,…作为字段名,@a表示追加写, 不使用 @a 表示覆盖,分发到文本的脱敏结果如下:【注意】集算器 SPL 的文件处理能力还支持导入、导出 xls、xlsx、csv 等多种类型文件。1.4.7.2 文本分发到数据库使用集算器 SPL 编码实现的文本分发到数据库(以 MySQL 为例)的脚本如下: A1-A3:同上。A4:连接 MySQL 数据源。使用connect()进行 MySQL 数据库的连接。如果用鼠标点击 A4 单元格,可以直接查看 MySQL 数据库的连接信息。具体查看数据库配置教程相关章节文档配置说明。A5:更新 MySQL 数据库中“personinfo”库表的数据。使用update()将单元格 A3 的游标数据更新到 MySQL 数据库“personinfo”库表中。使用数据库工具查看结果如下A6:使用close()函数关闭 A4 建立起的 MySQL 数据源连接。1.4.7.3 数据库分到数据库使用集算器 SPL 编码实现的数据库分发到数据库的脚本如下(均以 MySQL 为例): A1:同上。A2:连接 MySQL 数据源。A3:游标读取 MySQL 中表“personinfo_copy”的待脱敏数据。该表的数据如下:A4:同上。A5:更新 MySQL 数据库中“personinfo_copy_test”库表的数据。使用update()将单元格 A3 的游标数据更新到 MySQL 数据库的“personinfo_copy_test”库表中。结果如下:A6:使用close()函数关闭 A2 建立起的 MySQL 数据源连接。1.4.7.4 数据库分到文本使用集算器 SPL 编码实现的数据库(以 MySQL 为例)分发到文本的脚本如下: A1-A4:同上。A5:直接将脱敏的数据库(MySQL)数据分发到文本文件。分发到文本的脱敏结果同上。A6:使用close()函数关闭 A2 建立起的 MySQL 数据源连接。1.5 脱敏数据报表查询实例下面我们就结合上面介绍的数据脱敏方法,具体实现一个可以动态配置是否脱敏数据的报表查询实例,大致流程如下:1.5.1 集算器数据脱敏 SPL 脚本准备 利用上面已有的"数据脱敏验证表.txt" 文本数据,实现脱敏数据报表查询,具体脚本如下: A1-B1:引入外部字典表“姓氏”和“名字”的文本数据,用于随机组合生成姓名信息。A2:定义一个子程序。使用func函数定义一个通用的数据脱敏规则处理子程序,该子程序主要是调用配置文件中的数据脱敏规则进行数据脱敏。不同数据字段可以根据自身特点和业务要求进行规则复用。关于子程序的内容可以参考:集算器 -> 教程 -> 高级代码 ->子程序文档说明。B3:读取数据脱敏规则配置文件信息。使用property()函数从“数据脱敏规则配置.ini”属性文件中读取 type 属性值。B4-B5:使用动态解析并计算规则配置文件中的规则,实现对应字段的数据脱敏处理。其中,子程序中使用eval()函数动态解析并计算表达式,实现动态解析并替换脱敏规则配置文件(*.ini)中的 "?" 值,增加一个 type 值判断,将一般 type 中的 "?" 替换为调用 func 子程序主格的位置值,对引入外部数据字典表的 tpye2 规则,单独判断替换 "?" 值为外部字典所在单元格值,最终计算替换的表达式并执行对应字段的数据脱敏。B6:使用宏动态计算表达式并返回运算结果,使用return函数将从属性配置文件中读取的 type 属性值通过“${}”宏替换并返回运算结果给被 B9 单元格调用的程序中。A7:游标获取未脱敏的源端生产数据。A8:通过传递的网格参数 type(type=0:不脱敏)值判断是否对数据脱敏,如果脱敏,则执行 B9 单元格的源端生产数据的脱敏处理。B9:按照脱敏规则进行数据表脱敏,直接调用 A2 主格子程序 func 进行数据脱敏。A10:根据 type 值返回对应的脱敏或未脱敏数据。接下来,需要在集算器设计器的功能菜单“程序 -> 网格参数”中设置一个参数“type”,用于接收报表参数传递进行是否脱敏的数据权限控制。至此,集算器的 SPL 脚本编写和设置完成,下一步进行“数据脱敏规则配置.ini”文件的新建设置。1.5.2 数据脱敏规则配置文件文件“数据脱敏规则配置.ini”为集算器 SPL 脚本提供了对数据字段的脱敏规则配置,从而实现脱敏规则与脚本分离的设计,可以在不修改脚本的情况下自定义脱敏规则。当然,这个配置文件也可以数存储在数据库中,提供全局的脱敏规则配置管理。该配置文件的内容如下:配置文件说明:#自定义配置脱敏规则,使用 eval() 函数实现动态解析替换解析 "?",通常 type 中的 "?" 是指固定调用 func 子程序的主格,这里 tpye2 规则特殊,需要单独判断替换 "?"。【注意】这里仅是提供一种脱敏规则的配置思路,目的是可以最大限度的复用和灵活调用,相似的数据字段就不需要重复定义和编写脱敏规则了。实际应用中,程序员们可以根据需求自定义配置。1.5.3 报表模板准备使用最新版本的润乾报表 V2018 版本开发一张报表模板,并设置报表是否脱敏参数“type”(与集算器 SPL 脚本中的网格参数对应使用)。设置集算器 SPL 脚本为报表的数据集“ds1”,选中对应的 dfx 脚本,并配置 type 参数表达式,具体如下:开发的报表模板“报表数据脱敏.rpx”如下:【注意】这里面调用的集算器数据集返回的是游标,需要在报表属性 -> 常规 设置集算器数据集为大数据集,并且该功能需要报表产品包含集算器授权。1.5.4 脱敏数据报表发布直接在报表设计器中启动 web 服务,使用浏览器浏览报表,当设置参数 type 值为“0”不脱敏时,报表展示数据如下:当参数 type 设置非“0”值时,报表展示数据如下:1.5.5 脱敏数据报表查询总结这个脱敏数据报表查询实例有以下四个特点:l 1)直接对源数据脱敏后在报表 WEB 端进行数据查询和展示。没有按常规数据脱敏的方式,先将脱敏数据进行分发入库或入文件,而是直接将数据使用集算器 SPL 脚本进行脱敏,配合报表的大数据集异步数据加载实现了大数据的即时脱敏数据查询展示。免去源数据脱敏 -> 目标入库 -> 数据展示的目标入库步骤。l 2)免去新建数据脱敏库步骤,减少脱敏工作量。为了应对一些老项目或特殊情况,比如脱敏的数据表都是明文显示,但是不能分发或新建脱敏后的数据库表,通过对明文数据直接抽取加密,免去新建脱密库步骤,减少整体脱敏工作量。l 3)自定义配置数据脱敏规则。可以灵活配置规则文件,满足不同的规则配置需求。l 4)动态控制数据是否开启脱敏权限。可以根据平台用户查看数据的权限,动态的传递参数值控制是否对数据进行脱敏显示,一方面防止数据的泄密,从底层保证数据安全,另一方面也为高权限客户提供查看敏感数据的途径。发布于 2018-12-24 17:26数据分析​赞同 17​​添加评论​分享​喜欢​收藏​申请

数据脱敏_ 敏感数据脱敏_敏感数据追溯_敏感数据安全 - 腾讯云

数据脱敏_ 敏感数据脱敏_敏感数据追溯_敏感数据安全 - 腾讯云

腾讯云最新活动HOT产品解决方案定价企业中心云市场开发者客户支持合作与生态了解腾讯云关闭

搜索

T-Sec 数据脱敏数据脱敏(Data Masking,DMask)是一款敏感数据脱敏与水印标记工具,可对数据系统中的敏感信息进行脱敏处理并在泄漏时提供追溯依据,为企业数据共享、迁移、分发提供安全保护措施。立即选购产品文档产品特性丰富脱敏算法支持哈希、遮蔽、随机替换、映射替换、变形、移位、洗牌、强加密算法等多种脱敏算法。可根据需求对敏感数据进行不同的脱敏处理。与业务同步产品支持周期性任务,能够在两个数据库之间周期性的自动同步数据。同步过程将数据抽取、处理、装载一次性完成,实现生成环境与分析测试环境的数据同步,有效保障业务协同。灵活的脱敏配置支持按表脱敏,按查询 SQL 脱敏,支持增量脱敏、多表同表并发执行,提供多种数据冲突及异常数据处理方式,可满足多种复杂的数据场景。应用场景内部数据迁移安全外部数据共享安全研发、测试、数据分析环境中,内部人员并不需要使用完全真实的数据,仅需要数据格式与生产环境一致即可。此时,如果数据不经处理,会产生数据泄漏的风险。内部人员如果因为一己私利倒卖关键数据,将对企业造成不可估量的损失。数据脱敏帮助企业在数据中生产环境向研发、测试、数据分析环境等迁移过程中,对数据进行脱敏处理,杜绝内部泄密。帮助与文档产品简介了解数据脱敏的概述和主要功能。购买指南了解数据脱敏的价格和计费方式。快速入门提供操作步骤、控制台登录、产品配置等流程。常见问题如何选择数据脱敏的规格型号?在选购数据脱敏时,一般以数据库实例数和所需功能作为依据。您在采购前可简单统计数据库台数,并考虑是否需要在数据泄密后进行事件追溯,以选择最合适的您环境的规格型号。选购数据脱敏时,应将其部署在哪个地域?数据脱敏支持处理哪些类型的数据库?更多问题请查看 常见问题,也可在 问答社区 中进行提问 。按照我们的 入门指南,只需点几次鼠标,即可开始使用数据脱敏。开始使用

Hutool:一行代码搞定数据脱敏 | 京东云技术团队 - FreeBuf网络安全行业门户

Hutool:一行代码搞定数据脱敏 | 京东云技术团队 - FreeBuf网络安全行业门户

主站 分类

漏洞

工具

极客

Web安全

系统安全

网络安全

无线安全

设备/客户端安全

数据安全

安全管理

企业安全

工控安全

特色

头条

人物志

活动

视频

观点

招聘

报告

资讯

区块链安全

标准与合规

容器安全

公开课

报告 专辑 ···公开课···商城···

用户服务

··· 行业服务

政 府

CNCERT

CNNVD

会员体系(甲方)

会员体系(厂商)

产品名录

企业空间

知识大陆 搜索 创作中心 登录注册 官方公众号企业安全新浪微博 FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。 FreeBuf+小程序把安全装进口袋 Hutool:一行代码搞定数据脱敏 | 京东云技术团队

关注

工具 Hutool:一行代码搞定数据脱敏 | 京东云技术团队

2023-08-10 18:10:13

1. 什么是数据脱敏1.1 数据脱敏的定义数据脱敏百度百科中是这样定义的:数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。这样就可以在开发、测试和其它非生产环境以及外包环境中安全地使用脱敏后的真实数据集。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。是数据库安全技术之一。总的来说,数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在数据脱敏过程中,通常会采用不同的算法和技术,以根据不同的需求和场景对数据进行处理。例如,对于身份证号码,可以使用掩码算法(masking)将前几位数字保留,其他位用“X”或"*"代替;对于姓名,可以使用伪造(pseudonymization)算法,将真实姓名替换成随机生成的假名。1.2 常用脱敏规则替换、重排、加密、截断、掩码2. Hutool工具介绍2.1 引入Maven配置在项目的pom.xml的dependencies中加入以下内容,这里以5.8.16版本为例。cn.hutoolhutool-all5.8.16注意 :Hutool 5.x支持JDK8+, 如果你的项目使用JDK7,请使用Hutool 4.x版本。本文使用的数据脱敏工具类只有在5.6+版本以上才提供。2.2 Hutool包含的组件一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:模块介绍hutool-aopJDK动态代理封装,提供非IOC下的切面支持hutool-bloomFilter布隆过滤,提供一些Hash算法的布隆过滤hutool-cache简单缓存实现hutool-core核心,包括Bean操作、日期、各种Util等hutool-cron定时任务模块,提供类Crontab表达式的定时任务hutool-crypto加密解密模块,提供对称、非对称和摘要算法封装hutool-dbJDBC封装后的数据操作,基于ActiveRecord思想hutool-dfa基于DFA模型的多关键字查找hutool-extra扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等)hutool-http基于HttpUrlConnection的Http客户端封装hutool-log自动识别日志实现的日志门面hutool-script脚本执行封装,例如Javascripthutool-setting功能更强大的Setting配置文件和Properties封装hutool-system系统参数调用封装(JVM信息等)hutool-jsonJSON实现hutool-captcha图片验证码实现hutool-poi针对POI中Excel和Word的封装hutool-socket基于Java的NIO和AIO的Socket封装hutool-jwtJSON Web Token (JWT)封装实现可以根据需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块,本文所使用的数据脱敏工具就是在hutool.core模块。2.3 Hutool支持的脱敏数据类型现阶段最新版本的Hutool支持的脱敏数据类型如下,基本覆盖了常见的敏感信息。1.用户id2.中文姓名3.身份证号4.座机号5.手机号6.地址7.电子邮件8.密码9.中国大陆车牌,包含普通车辆、新能源车辆10.银行卡3. Hutool数据脱敏实操3.1 使用Hutool工具类一行代码实现脱敏Hutool提供的脱敏方法如下图所示:注意 :Hutool 脱敏是通过*来代替敏感信息的,具体实现是在StrUtil.hide方法中,如果我们想要自定义隐藏符号,则可以把Hutool的源码拷出来,重新实现即可。这里以手机号、银行卡号、身份证号、密码信息的脱敏为例,下面是对应的测试代码。importcn.hutool.core.util.DesensitizedUtil;importorg.junit.Test;importorg.springframework.boot.test.context.SpringBootTest;/**

*

* @description: Hutool实现数据脱敏

*/@SpringBootTestpublicclassHuToolDesensitizationTest{@TestpublicvoidtestPhoneDesensitization(){Stringphone="13723231234";System.out.println(DesensitizedUtil.mobilePhone(phone));//输出:137****1234}@TestpublicvoidtestBankCardDesensitization(){StringbankCard="6217000130008255666";System.out.println(DesensitizedUtil.bankCard(bankCard));//输出:6217 **** **** *** 5666}@TestpublicvoidtestIdCardNumDesensitization(){StringidCardNum="411021199901102321";//只显示前4位和后2位System.out.println(DesensitizedUtil.idCardNum(idCardNum,4,2));//输出:4110************21}@TestpublicvoidtestPasswordDesensitization(){Stringpassword="www.jd.com_35711";System.out.println(DesensitizedUtil.password(password));//输出:****************}}以上就是使用Hutool封装好的工具类实现数据脱敏。3.2 配合JackSon通过注解方式实现脱敏现在有了数据脱敏工具类,如果前端需要显示数据数据的地方比较多,我们不可能在每个地方都调用一个工具类,这样就显得代码太冗余了,那我们如何通过注解的方式优雅的完成数据脱敏呢?如果项目是基于springboot的web项目,则可以利用springboot自带的jackson自定义序列化实现。它的实现原来其实就是在json进行序列化渲染给前端时,进行脱敏。第一步:脱敏策略的枚举。/**

* @author

* @description:脱敏策略枚举

*/publicenumDesensitizationTypeEnum{//自定义MY_RULE,//用户idUSER_ID,//中文名CHINESE_NAME,//身份证号ID_CARD,//座机号FIXED_PHONE,//手机号MOBILE_PHONE,//地址ADDRESS,//电子邮件EMAIL,//密码PASSWORD,//中国大陆车牌,包含普通车辆、新能源车辆CAR_LICENSE,//银行卡BANK_CARD

}上面表示支持的脱敏类型。第二步:定义一个用于脱敏的 Desensitization 注解。•@Retention(RetentionPolicy.RUNTIME):运行时生效。•@Target(ElementType.FIELD):可用在字段上。•@JacksonAnnotationsInside:此注解可以点进去看一下是一个元注解,主要是用户打包其他注解一起使用。•@JsonSerialize:上面说到过,该注解的作用就是可自定义序列化,可以用在注解上,方法上,字段上,类上,运行时生效等等,根据提供的序列化类里面的重写方法实现自定义序列化。/**

* @author

*/@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@JacksonAnnotationsInside@JsonSerialize(using =DesensitizationSerialize.class)public@interfaceDesensitization{/**

* 脱敏数据类型,在MY_RULE的时候,startInclude和endExclude生效

*/DesensitizationTypeEnumtype()defaultDesensitizationTypeEnum.MY_RULE;/**

* 脱敏开始位置(包含)

*/intstartInclude()default0;/**

* 脱敏结束位置(不包含)

*/intendExclude()default0;}注:只有使用了自定义的脱敏枚举MY_RULE的时候,开始位置和结束位置才生效。第三步:创建自定的序列化类这一步是我们实现数据脱敏的关键。自定义序列化类继承 JsonSerializer,实现ContextualSerializer接口,并重写两个方法。/**

* @author

* @description: 自定义序列化类

*/@AllArgsConstructor@NoArgsConstructorpublicclassDesensitizationSerializeextendsJsonSerializerimplementsContextualSerializer{privateDesensitizationTypeEnumtype;privateIntegerstartInclude;privateIntegerendExclude;@Overridepublicvoidserialize(Stringstr,JsonGeneratorjsonGenerator,SerializerProviderserializerProvider)throwsIOException{switch(type){// 自定义类型脱敏caseMY_RULE:jsonGenerator.writeString(CharSequenceUtil.hide(str,startInclude,endExclude));break;// userId脱敏caseUSER_ID:jsonGenerator.writeString(String.valueOf(DesensitizedUtil.userId()));break;// 中文姓名脱敏caseCHINESE_NAME:jsonGenerator.writeString(DesensitizedUtil.chineseName(String.valueOf(str)));break;// 身份证脱敏caseID_CARD:jsonGenerator.writeString(DesensitizedUtil.idCardNum(String.valueOf(str),1,2));break;// 固定电话脱敏caseFIXED_PHONE:jsonGenerator.writeString(DesensitizedUtil.fixedPhone(String.valueOf(str)));break;// 手机号脱敏caseMOBILE_PHONE:jsonGenerator.writeString(DesensitizedUtil.mobilePhone(String.valueOf(str)));break;// 地址脱敏caseADDRESS:jsonGenerator.writeString(DesensitizedUtil.address(String.valueOf(str),8));break;// 邮箱脱敏caseEMAIL:jsonGenerator.writeString(DesensitizedUtil.email(String.valueOf(str)));break;// 密码脱敏casePASSWORD:jsonGenerator.writeString(DesensitizedUtil.password(String.valueOf(str)));break;// 中国车牌脱敏caseCAR_LICENSE:jsonGenerator.writeString(DesensitizedUtil.carLicense(String.valueOf(str)));break;// 银行卡脱敏caseBANK_CARD:jsonGenerator.writeString(DesensitizedUtil.bankCard(String.valueOf(str)));break;default:}}@OverridepublicJsonSerializercreateContextual(SerializerProviderserializerProvider,BeanPropertybeanProperty)throwsJsonMappingException{if(beanProperty !=null){// 判断数据类型是否为String类型if(Objects.equals(beanProperty.getType().getRawClass(),String.class)){// 获取定义的注解Desensitizationdesensitization =beanProperty.getAnnotation(Desensitization.class);// 为nullif(desensitization ==null){desensitization =beanProperty.getContextAnnotation(Desensitization.class);}// 不为nullif(desensitization !=null){// 创建定义的序列化类的实例并且返回,入参为注解定义的type,开始位置,结束位置。returnnewDesensitizationSerialize(desensitization.type(),desensitization.startInclude(),desensitization.endExclude());}}returnserializerProvider.findValueSerializer(beanProperty.getType(),beanProperty);}returnserializerProvider.findNullValueSerializer(null);}}经过上述三步,已经完成了通过注解实现数据脱敏了,下面我们来测试一下。首先定义一个要测试的pojo,对应的字段加入要脱敏的策略。/**

*

* @description:

*/@Data@NoArgsConstructor@AllArgsConstructorpublicclassTestPojo{privateStringuserName;@Desensitization(type =DesensitizationTypeEnum.MOBILE_PHONE)privateStringphone;@Desensitization(type =DesensitizationTypeEnum.PASSWORD)privateStringpassword;@Desensitization(type =DesensitizationTypeEnum.MY_RULE,startInclude =0,endExclude =2)privateStringaddress;}接下来写一个测试的controller@RestControllerpublicclassTestController{@RequestMapping("/test")publicTestPojotestDesensitization(){TestPojotestPojo =newTestPojo();testPojo.setUserName("我是用户名");testPojo.setAddress("地球中国-北京市通州区京东总部2号楼");testPojo.setPhone("13782946666");testPojo.setPassword("sunyangwei123123123.");System.out.println(testPojo);returntestPojo;}}可以看到我们成功实现了数据脱敏。4. 其他常见的数据脱敏工具推荐除了本文介绍的Hutool工具之外,还有一些其他的数据脱敏工具,常见脱敏方法或工具如下所示:4.1 Apache ShardingSphereApache ShardingSphere下面存在一个数据脱敏模块,此模块集成的常用的数据脱敏的功能。其基本原理是对用户输入的SQL进行解析拦截,并依靠用户的脱敏配置进行SQL的改写,从而实现对原文字段的加密及加密字段的解密。最终实现对用户无感的加解密存储、查询。具体实现方式可参考下面文章: https://jaskey.github.io/blog/2020/03/18/sharding-sphere-data-desensitization/4.2 FastJSON平时开发Web项目的时候,除了默认的Spring自带的序列化工具,FastJson也是一个很常用的Spring web Restful接口序列化的工具。FastJSON实现数据脱敏的方式主要有两种:•基于注解@JSONField实现:需要自定义一个用于脱敏的序列化的类,然后在需要脱敏的字段上通过@JSONField中的serializeUsing 指定为我们自定义的序列化类型即可。•基于序列化过滤器:需要实现ValueFilter接口,重写process方法完成自定义脱敏,然后在JSON转换时使用自定义的转换策略。具体实现可参考这篇文章: https://juejin.cn/post/70679166861411614794.3 Mybatis-matemybatisplus也提供了数据脱敏模块,mybatis-mate,不过在使用之前需要配置授权码。配置内容如下所示:# Mybatis Mate 配置

mybatis-mate:

cert:

grant: jxftsdfggggx

license: GKXP9r4MCJhGID/DTGigcBcLmZjb1YZGjE4GXaAoxbtGsPC20sxpEtiUr2F7Nb1ANTUekvF6Syo6DzraA4M4oacwoLVTglzfvaEfadfsd232485eLJK1QsskrSJmreMnEaNh9lsV7Lpbxy9JeGCeM0HPEbRvq8Y+8dUt5bQYLklsa3ZIBexir+4XykZY15uqn1pYIp4pEK0+aINTa57xjJNoWuBIqm7BdFIb4l1TAcPYMTsMXhF5hfMmKD2h391HxWTshJ6jbt4YqdKD167AgeoM+B+DE1jxlLjcpskY+kFs9piOS7RCcmKBBUOgX2BD/JxhR2gQ==具体实现可参考baomidou提供的如下代码: https://gitee.com/baomidou/mybatis-mate-examples5. 总结本文主要介绍了数据脱敏的相关内容,首先介绍了数据脱敏的概念,在此基础上介绍了常用的数据脱敏规则;随后介绍了本文的重点Hutool工具及其使用方法,在此基础上进行了实操,分别演示了使用DesensitizedUtil工具类、配合Jackson通过注解的方式完成数据脱敏;最后,介绍了一些常见的数据脱敏方法,并附上了对应的教程链接供大家参考,本文内容如有不当之处,还请大家批评指正。6. 参考内容Hutool工具官网: https://hutool.cn/docs/#/?id=%f0%9f%93%9a%e7%ae%80%e4%bb%8b聊聊如何自定义数据脱敏: https://juejin.cn/post/7046567603971719204FastJSON实现数据脱敏: https://juejin.cn/post/7067916686141161479作者:京东科技 孙扬威来源:京东云开发者社区 本文作者:,

转载请注明来自FreeBuf.COM # 数据安全 # 隐私数据 # 数据脱敏 # 数据脱敏技术 # 隐私数据保护

被以下专辑收录,发现更多精彩内容

+ 收入我的专辑

+ 加入我的收藏

展开更多

相关推荐

关 注 0 文章数 0 关注者

文章目录

1. 什么是数据脱敏 1.1 数据脱敏的定义1.2 常用脱敏规则2. Hutool工具介绍 2.1 引入Maven配置2.2 Hutool包含的组件2.3 Hutool支持的脱敏数据类型3. Hutool数据脱敏实操 3.1 使用Hutool工具类一行代码实现脱敏3.2 配合JackSon通过注解方式实现脱敏4. 其他常见的数据脱敏工具推荐 4.1 Apache ShardingSphere4.2 FastJSON4.3 Mybatis-mate5. 总结 6. 参考内容 本站由阿里云 提供计算与安全服务 用户服务 有奖投稿 提交漏洞 参与众测 商城 企业服务 安全咨询 产业全景图 企业SRC 安全众测 合作信息 斗象官网 广告投放 联系我们 友情链接 关于我们 关于我们 加入我们 微信公众号 新浪微博 战略伙伴 FreeBuf+小程序 扫码把安全装进口袋 斗象科技 FreeBuf 漏洞盒子 斗象智能安全平台 免责条款 协议条款

Copyright © 2020 WWW.FREEBUF.COM All Rights Reserved

   沪ICP备13033796号

|

沪公安网备

万字详解数据安全关键技术之数据脱敏 - 知乎

万字详解数据安全关键技术之数据脱敏 - 知乎切换模式写文章登录/注册万字详解数据安全关键技术之数据脱敏美创科技数据安全领导者和引路人,数字化转型推动者摘要数据脱敏是数据安全领域落地场景较为成熟的技术手段,在数据深层次、大范围的共享开放的今天,数据脱敏在不影响数据使用的前提下,保护敏感隐私数据,已成为数据安全建设重要内容。本文通过对数据脱敏技术及应用场景等进行梳理,为各行业用户更好的实施数据脱敏技术提供指南,主要内容包括以下四个方面:数据脱敏法规政策合规依据数据脱敏技术定义及实施过程解析数据脱敏典型应用场景数据脱敏管理体系的建立数据脱敏法规政策合规依据《网络安全法》第四十二条:网络运营者不得泄露、篡改、毁损其收集的个人信息;未经被收集者同意,不得向他人提供个人信息。但是,经过处理无法识别特定个人且不能复原的除外。《数据安全法》第二十七条:开展数据处理活动应当依照法律、法规的规定,建立健全全流程数据安全管理制度,采取相应的技术措施和其他必要措施,保障数据安全。《个人信息保护法》第五十一条:个人信息处理者应当根据个人信息的处理目的、处理方式、个人信息的种类以及对个人权益的影响、可能存在的安全风险等,采取相应的加密、去标识化等安全技术措施。《信息安全技术 网络安全等级保护基本要求》明确规定,二级以上保护则需要对敏感数据进行脱敏处理。其中H.4.3 安全计算环境要求“大数据平台应提供静态脱敏和去标识化的工具或服务组件技术。”H.4.5 安全运维管理 “应在数据分类分级的基础上,划分重要数字资产范围,明确重要数据进行自动脱敏或去标识使用场景和业务处理流程。”《网络数据安全管理条例(征求意见稿)》第十二条:数据处理者向第三方提供个人信息,或者共享、交易、委托处理重要数据的,应当向个人告知提供个人信息的目的、类型、方式、范围、存储期限、存储地点,并取得个人单独同意,符合法律、行政法规规定的不需要取得个人同意的情形或者经过匿名化处理的除外。典型行业:金融行业合规要求《中国银行业“十二五”信息科技发展规则监管指导意见》:加强数据、文档的安全管理,逐步建立信息资产分类分级保护机制。完善敏感信息存储和传输等高风险环节的控制措施,对数据、文档的访问应建立严格的审批机制。对用于测试的生产数据要进行脱敏处理,严格防止敏感数据泄露。《金融行业网络安全等级保护实施指引》:应将开发环境、测试环境、实际运行环境相互分离,敏感数据经过脱敏后才可在开发或测试中使用。《金融数据 安全数据生命周期安全规范》:开发测试等过程的数据,应事先进行脱敏处理,防止数据处理过程中的数据泄露,国家及行 业主管部门另有规定的除外。《商业银行信息科技风险现场检查指南》: 开发过程中是否使用了生产数据,使用的生产数据是否得到高级管理层的批准并经过脱敏或相关限制。”“测试用例是否有生产数据,当使用生产数据测试时是否得到高级管理层的审批并采取相关限制及进行脱敏处理。典型行业:电信和互联网行业合规要求《电信和互联网行业数据安全 标准体系建设指南》:数据处理 数据处理标准用于规范敏感数据、个人信息的保护机制 及相关技术要求,明确敏感数据保护的场景、规则、技术方法,主要包括匿名化/去标识化、数据脱敏、异常行为识别等标准。《电信和互联网行业提升网络数据安全保护能力专项行动方案》:指导电信和重点互联网企业加强内部网络数据安全组织保障,推动设立或明确网络数据安全管理责任部门和专职人员,负责承担企业内部网络数据安全管理工作,督促协调企业内部各相关主体和环节严格落实操作权限管理、日志记录和安全审计、数据加密、数据脱敏、访问控制、数据容灾备份等数据安全保护措施,组织开展数据安全岗位人员法律法规、知识技能等培训。《电信网和互联网数据脱敏技术要求与测试方法》:提出了数据脱敏技术应用架构,并且总结了在实际应用数据脱敏技术过程中,主要涉及的三个要素:脱敏算法、脱敏规则、脱敏策略。此外标准还提出了数据脱敏后的效果评估策略。《电信网和互联网数据安全评估规范》:查验企业数据脱敏处理管理规范和制度文件,是否明确数据脱敏处理使用应用场景,明确数据脱敏规则、脱敏方法、数据脱敏处理流程、涉及部门及人员的职责分工等。查验企业数据脱敏处理管理规范和制度,企业业务和业务支撑系统在数据权限和资源的申请阶段,是否由该数据的数据安全管理负责人员评估使用真实数据的必要性,以及确定该场景下适用的数据脱敏规则及方法。查验数据脱敏处理管理规范和制度,是否建立数据脱敏处理技术应用安全评估机制,对脱敏后的数据可恢复性进行安全评估,是否对于可恢复形成原始数据的脱敏方法(含算法)进行安全加强。演示企业业务测试系统数据库,企业是否使用未脱敏的数据用于业务系统的开发测试。查验演示企业数据脱敏工具,是否能对数据脱敏处理过程相应的操作进行记录,提供数据脱敏处理安全审计能力。数据脱敏技术定义及实施过程解析数据脱敏的定义数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。数据脱敏发展历程人工脱敏阶段:多为SQL脚本方式,在ETL处理过程中进行脱敏,该方式工作量大、数据处理效率低,同时存在数据质量差、无法保证数据结构的完整性、数据间的关联性。平台脱敏阶段: 融合了敏感数据自动发现、系统流程化脱敏、支持丰富数据源、脱敏算法库充足、敏感类型丰富等功能,从而减轻人工成本的同时提升效率, 保证数据脱敏的基本诉求。自动脱敏阶段:通过应用机器学习等技术,结合各类数据分类分级规则及已实际使用的数据脱敏策略及规则,实现自动化实时敏感数据发现、自动化脱敏规则匹配等智能化数据脱敏的结果。同时,具备分布式等多种部署支持,智能性能分析,自动化调优等能力。数据脱敏关键技术能力高仿真能力:保持数据原始业务特征保持数据之间的关联性保持数据之间逻辑一致性业务依赖数据对象同步丰富数据源支持:关系型数据库支持大数据平台支持特殊文件类型支持消息列队支持内置丰富脱敏规则:支持多种数据脱敏算法支持组合脱敏、自定义分组规则具备细粒度数据处理能力高处理效率:单台设备性能最大化具备增量脱敏能力支持分布式部署数据脱敏分类类型常用场景具体示例静态数据脱敏通常用于非实时场景。将生产环境中的数据脱敏用于测试环境。动态数据脱敏常用于生产环境等实时场景,在应用或平台用户访问敏感数据的同时进行脱敏,用于解决根据不同情况对统一敏感数据读取时需要进行不同级别、类型脱敏的场景适用于对生产数据共享或时效性很高的数据访问场景等,实现对生产数据库中的敏感数据进行透明、实时脱敏。如上图所示:动态脱敏会对数据进行多次脱敏,更多应用于直接连接生产数据的场景,在用户访问生产环境敏感数据时,通过匹配用户IP或MAC地址等脱敏条件,根据用户权限采用改写查询SQL语句等方式返回脱敏后的数据。例如运维人员在运维工作中直连生产数据库,业务人员需要通过生产环境查询客户信息等脱敏算法推荐形态算法描述适用数据类型推荐脱敏形态重排跨行随机互换原始敏感数据,打破原始敏感数据与本行其他数据关联关系。通用动态脱敏、静态脱敏关系映射原始敏感数据间存在业务关联关系,需要在数据脱敏后仍旧保持关系。因此在脱敏处理中,利用算法表达式对脱敏后的数据进行函数映射,使其脱敏后仍旧保持业务关联关系。通用动态脱敏、静态脱敏偏移取整按照一定粒度进行偏移取整。日期、时间、数字动态脱敏、静态脱敏散列对原始数据通过散列算法计算,使用计算后的散列来代替原始数据。通用动态脱敏、静态脱敏加密通过加密密钥和算法对原始数据进行加密,从而使敏感数据变成不可读的密文。通用静态脱敏格式保留算法(FPE)一种特殊的加密脱敏算法,对敏感数据进行加密脱敏,密文与原始数据保持格式一致。通用静态脱敏常量替换使用常量伪装数据对原始数据进行替换(伪装数据生成与原始数据值无关)。通用动态脱敏、静态脱敏随机替换保持数据格式,按照特定原始数据的编码规则重新生成一份新的数据。通用动态脱敏、静态脱敏截断截断内容通用动态脱敏、静态脱敏标签化按照预定类别进行分类,将使用类别标签替换原始敏感数据。通用动态脱敏、静态脱敏泛化用更一般的值取代原始数据,降低敏感数据精确度,达到无法识别个体的目的。通用动态脱敏、静态脱敏匿名通过对数据内容的处理,保证在数据表发布时,数据中存在一定量的准标识符上不可区分的记录。通用静态脱敏差分隐私在原数据中加入噪音信息,使得满足差分隐私的数据集能够抵抗任何对隐私数据的分析。数据集数据脱敏浮动通过浮动脱敏算法,上浮、下降5%。数据集静态脱敏归零通过归零算法对原数据381.38进行脱敏。数据集静态脱敏均化通过均化算法进行脱敏。数据集静态脱敏分档将数据按照规模分为高、中、低三档,分别进行脱敏。数据集静态脱敏掩码对原始数据的部分内容用通用字符进行统一替换,从而使敏感数据仅保持部分内容公开。字符串动态脱敏、静态脱敏数据脱敏的常用算法与实例算法名称算法说明示例使用场景(仅做参考)固定映射通过设置映射种子,在映射种子不变的情况下,相同原数据脱敏后结果相同,并保留原始业务特征映射种子:111原数据:张三一次脱敏结果:李四二次脱敏结果:李四中文姓名、身份证、电话、银行卡、电子邮箱、地址、IP地址日期、通用字符串、键、货币金额医疗机构登记号、医师资格证书、医师执业证书营业执照、社会统一信用代码、组织机构代码、税务登记证、开户许可证护照、军官证、中国护照、港澳通行证、永久居住证、台湾同胞大陆通行证证券名称、证券代码、基金名称、基金代码随机映射对数值、字符或字符串进行随机,并保留原业务特征原数据:19841222脱敏结果:19900211中文姓名、身份证、电话、银行卡、电子邮箱、地址、邮政编码、IP地址CCV码货币金额、通用字符串、字符串医疗机构登记号、医师资格证书、医师执业证书营业执照、社会统一信用代码、税务登记证、开户许可证、组织机构代码、组织机构名称护照、军官证、中国护照、港澳通行证、永久居住证、台湾同胞大陆通行证证券名称、证券代码、基金名称、基金代码遮盖通过设置遮盖符,对原数据全部或部分进行遮盖处理遮盖符:*原数据:13512345678脱敏结果:135****5678中文姓名、身份证、电话、银行卡、电子邮箱、地址、CCV码、IP地址组织机构代码、组织机构名称、营业执照、社会统一信用代码医疗机构登记号、医师资格证书、医师执业证书护照、税务登记证、开户许可证、军官证、中国护照、港澳通行证、永久居住证、台湾同胞大陆通行证证券名称、证券代码、基金名称、基金代码范围内随机(泛化脱敏)对日期或金额,在一个指定的范围内进行随机,并保留原业务特征范围1000至9999原数据:38472.00脱敏结果:8394.00日期货币金额通用数值保留随机选中分段保留,其他分段随机原数据:2020年10月10日脱敏算法:【1900-2018】年、【01-12】月、【01-30】日日期浮动对日期或金额,上浮或下降固定值或百分比,并保留原业务特征上浮、下降5%原数据:1000.00脱敏结果:1049.00日期归零对于数值,清空并置为0.00原数据:381.38脱敏结果:0.00通用数值截取对字符串按照起始位置进行截取开始位置:2,结束位置6原数据:abcdefghijk脱敏结果:bcdef通用字符串截断对字符串保留除起始位置意外的内容开始位置:2,结束位置6原数据:abcdefghijk脱敏结果:aghijk通用字符串数字截断将数字截断,只保留指定位数如12345678,保留“3位”,则为678。通用数值加密通过不同的加密算法进行加密,脱敏后显示的数据为密文数据SHA1加密、MD5加密、SHA256加密、AES对称加密、RSA非对称加密、SMS4加密等中文姓名、身份证、电话、银行卡、电子邮箱、地址、IP地址邮政编码(SHA1加密、MD5加密)营业执照、社会统一信用代码、组织机构代码、税务登记证、开户许可证医疗机构登记号、医师资格证书、医师执业证书护照、税务登记证、开户许可证、军官证、中国护照、港澳通行证、永久居住证、台湾同胞大陆通行证证券名称、证券代码、基金名称、基金代码替换将数据替换为一个常量,常用作不需要改敏感字段时原值:566原值:789脱敏后:566 - 0789 - 0通用字符串匹配替换通过EXCL表格导入替换规则,完成匹配替换1111替换为22223333替换为4444通用字符串水印通过数字水印打上水印标签伪行、伪列或者不可见字符日期偏移小数点往左或往右进行偏移如设定偏移量【2】,则脱敏结果可能为【28.00】货币金额通用数值取整对数字位数进行取整如取整位数为2,则1988.65脱敏后为1900如12345678,整数“3位”,则为12345000货币金额通用数值分段主要针对数字进行脱敏,可以将同一范围的数值脱敏为相同的数值如1~99的数值,统一脱敏未1100~199的数值,统一脱敏为2200~299的数值,统一脱敏为3货币金额其它脱敏算法:算法名称算法说明示例使用场景(仅做参考)均值脱敏我们先计算它们的均值,然后使脱敏后的值在均值附近随机分布,从而保持数据的总和不变。如学科总分500分脱敏后各科学分相加还是为500分。货币金额哈希将数据映射为一个hash值Jim,Greenà45639334453用作将不定长的数据映射为定场的hash值。数据脱敏策略在设定具体场景下数据脱敏策略时应充分考虑数据脱敏后数据自身可用性及数据保密性寻求两者间的平衡。数据脱敏策略的选择如下显示。数据脱敏的目标包括:避免攻击者识别出原始个人信息主体;控制重标识的风险,确保重标识风险不会增加;在控制重标识风险的前提下,确保脱敏后的数据集尽量满足其预期目的;选择合适的数据处理方式保证信息攻击成本不足以支撑攻击动机。数据脱敏实施流程敏感数据识别:即对生产系统中敏感数据的识别,主要包括:存储位置:明确敏感数据所在的数据库、表、字段(列);数据分类、分级:明确敏感数据所属类别及敏感级别。策略选择、算法配置,包括数据脱敏后保持原始特征的分析、数据脱敏算法的选择和数据脱敏算法参数配置:保持原始数据的格式、类型;保持原有数据之间的依存关系;保持引用完整性、统计特性、频率分布、唯一性、稳定性。配置需要脱敏的目标(数据库名/表名/字段名)以及适当的脱敏算法参数,根据业务需求完成其他算法的参数配置。数据脱敏任务执行阶段,按不同需求选择,分为动态脱敏处理步骤和静态脱敏处理步骤: 1. 动态脱敏处理步骤:协议解析:解析用户、应用访问大数据组件网络流量;语法解析:对访问大数据组件的语句进行语法分析;脱敏规则匹配:根据用户身份信息及要访问的数据;下发脱敏任务:由脱敏引擎调度脱敏任务;脱敏结果输出:将脱敏后的数据输出,保证原始数据的不可见。 2. 静态脱敏处理步骤:数据选择/策略配置:选择待脱敏的数据库及表,配置脱敏策略及脱敏算法,生成脱敏任务;执行脱敏处理:对不同类型数据进行处理,将数据中的敏感信息进行删除或隐藏;数据导出:将脱敏后的数据按用户需求,装载至不同环境中,包括文件至文件,文件至数据库,数据库至数据库,数据库至文件等多种装载方式。数据脱敏典型应用场景开发测试场景开发测试场景中,如银行、证券等金融行业业务系统中含有姓名、身份、账号等敏感信息,开发测试需要使用仿真的数据,因此需要通过脱敏手段保证敏感数据不被泄露。场景特点:数据库类型多,系统体系架构复杂,跨系统、跨平台测试数据难以获取。开发测试场景需高度模拟生产环境,对脱敏后数据与业务的一致性有严格要求。生产环境与开发测试环境互相隔离,彼此无法互相访问。部分行业如银行金融机构日新增数据量较大,无法定期对全量数据进行脱敏,要求数据脱敏系统具备增量脱敏能力。要求具备多种脱敏算法。如在金融机构脱敏场景中,需保持脱敏后不同字段之间的数据计算关系,如“2+3=5” 脱敏后需要保持等号左边的数值等于右边。关键能力:支持主流关系型数据库、大数据平台、格式化文本文件、Oracle dump 文件支持通过ftp文件服务器的连接,对隔离的开发测试环境进行中转导入支持对于Oracle dmp文件进行直接解析,并进行脱敏处理。数据脱敏根据实际业务需求提供脱敏数据,可通过数据子集、黑名单、白名单等方式控制数据脱敏范围。支持对生产数据全量和增量的方式脱敏,可设置脱敏的作业的调度周期,并对作业过程进行监控,支持脱敏前后的数据在线比对功能。提供多种数据脱敏算法。教学培训场景教学培训场景即对数据进行统计分析,以用于科学研究,该场景下需要保证数据特征,脱敏后保证科学研究所必须的内容。场景特点:为保证获取的数据可以满足科学研究,保留数据的真实有效性。脱敏后的数据需要有教学培训的价值,数据的业务特征不能丧失。脱敏后的数据需要保持其完整性,保证其长度不变、数据内涵的不丢失。 关键能力:内置丰富的数据脱敏算法及数据分段脱敏的能力,可适配不同的数据分析场景,从而在保证数据脱敏或降敏的前提下,安全地进行各种数据分析。保证主外键一致、业务关联一致、有依赖字段的敏感信息脱敏一致、多次脱敏结果保持一致等,整体保证脱敏前后一致性,保持数据间的逻辑关系。保持数据字段、数据对象从源到目标的完整迁移分析挖掘场景数据分析的有效性往往依赖于基础数据的质量,基础数据的可用性直接影响分析结果和企业决策。在涉及到大数据分析应用的领域,企业需要在保证数据安全及合规的前提下,依旧能够保有数据的可用性及可挖掘分析的价值。场景特点:数据脱敏时应保持与原数据高仿真,不破坏数据间的关联关系,确保数据分析结果仍然具有指导性。大数据分析平台中包括海量的用户隐私和敏感数据,针对大数据环境进行数据脱敏,数据结构复杂,包括结构化、非结构化数据等,脱敏操作复杂。特定场景下需对脱敏数据进行复敏,例如银行通过对脱敏后的转账记录、贷款记录、还款记录等进行分析,评估出个性信用等级,最后将结果回溯到真实银行客户。关键能力:保证主外键一致、业务关联一致、有依赖字段的敏感信息脱敏一致、多次脱敏结果保持一致等,整体保证脱敏前后一致性,保持数据间的逻辑关系。支持HDFS、Hive、Impala、ODPS、Teradata、Greenplum、MongoDB、FusionInsight等大数据敏感源。支持数据脱敏复敏,具备复敏权限的用户才能进行此操作,充分保证安全性。数据上报场景数据上报场景很可能涉及隐私敏感数据信息,在上报过程中需对敏感隐私数据进行匿名化处理。场景特点:数据脱敏能够有效防止敏感数据泄漏,但是像医疗、金融、政府等具有强监管机构的行业,需要进行数据上报的数据流动场景。数据上报过程中的脱敏数据要保持与原数据高仿真,不破坏数据间的关联关系,确保数据上报的内容仍然具有其业务特征。部分行业的数据上报需对脱敏数据进行复敏,例如政务行业、金融行业有强监管的需求。关键能力:保证主外键一致、业务关联一致、有依赖字段的敏感信息脱敏一致、多次脱敏结果保持一致等,整体保证脱敏前后一致性,保持数据间的逻辑关系。内置数据水印及溯源功能,用户可自定义水印内容,同时通过算法保证水印内容的抗破坏性,从而保证在数据被分享给第三方后,可通过系统进行溯源及追责。支持数据脱敏复敏,具备复敏权限的用户才能进行此操作,充分保证安全性。共享交换场景现代企业对外合作日益增多,数据交换愈发频繁,需要合理管控数据外发,当敏感数据外发至低安全区域时,通过对数据进行脱敏变形,避免隐私数据泄露。场景特点:数据共享场景中,特定需求下需保留部分敏感数据字段,但对其他隐私数据可以进行遮蔽、仿真等操作。作为数据提供方,需提供溯源机制,当发生数据泄露的时候,可以确定数据泄露方,便于溯源追责。关键能力:预设丰富的敏感对象,包括个人隐私、金融财务、商业机密、医疗数据、相关证件等,在进行数据脱敏时,将会对设定的敏感对象按照规则进行脱敏,且可根据实际需求自定义敏感对象,完善敏感对象库。对于脱敏源中存在的脏数据(不符合敏感对象业务特征的数据),系统同样会对这部分数据进行变形处理,以避免隐形敏感数据泄露。内置数据水印及溯源功能,用户可自定义水印内容,同时通过算法保证水印内容的抗破坏性,从而保证在数据被分享给第三方后,可通过系统进行溯源及追责。业务查询场景在业务系统对外提供服务时,通常面临客户群体通过账号即可访问真实数据的情况,一旦账户被仿冒登陆,显示真实信息、未对关键信息进行脱敏,会加大数据泄露的现象。场景特点:业务访问隐私化处理,在医疗、金融的典型行业中,业务系统的访问常常需要直接去隐私化展示信息。防止批量脱库数据泄露,黑客会通过访问前端应用程序过程中植入漏洞窃取数据,因此在访问过程中需做到敏感数据及时脱敏,减少批量数据泄露问题。关键能力:无需对应用系统改造、无需修改数据库及存储数据,即可实现数据动态脱敏。精确识别业务系统三层的用户身份,针对不同的身份采用不同的动态脱敏策略,对不同权限的用户可分别返回真实数据、部分遮盖、全部遮盖等脱敏结果。支持的灵活脱敏策略配置。运维管理场景运维管理场景下需要对运维人员的操作及管理进行全面审计及访问控制,从而达到数据在维护时的安全呈现。场景特点:运维人员具备高权限账户,若未加管控,意味着可以任意访问数据,成为批量数据泄露的主要来源之一从职责分离的原则上,实现既允许运维人员访问业务生产数据库又不能让他们看到核心敏感数据,对于隐私保护同时还需要有预防性(事前)的技术能力关键能力:准入控制:支持多维身份管理;支持对运维工具或客户端应用程序进行签名登陆验证,防止恶意和仿冒工具/程序登陆数据库;支持安全管理员、系统管理员、安全审计员三权分立。访问控制:支持禁止DBA、SYSDBA、Schema User、Any等特权用户访问和操作敏感数据集合。支持查询结果返回行数控制,避免数据大量泄漏;支持访问频次控制,避免一定时间内的高频次访问,避免数据流失;支持敏感SQL管理。全面运维审计,记录包括用户名、IP地址、MAC地址、客户端程序名、执行语句的时间、执行的SQL语句、操作的对象等,对其行为进行全程细粒度的审计分析。数据脱敏管理体系的建立建立组织架构,对参与人员职责划分;脱敏操作员:负责数据脱敏工作的具体执行,并向安全管理员和脱敏审计员定期汇报工作情况。安全管理员:负责制定脱敏系统的安全策略,数据脱敏工作的范围和日程,并进行日常安全检查、权限管理和日常操作培训。审计管理员:负责对脱敏操作员、安全管理员的操作行为进行审计、跟踪、分析、和监督检查,及时发现违规行为和异常行为,进行数据库日志、脱敏系统日志、安全事件的分析和取证。建立符合业务需求的数据脱敏技术流程:确定需求:根据业务需求,确定数据脱敏的方式,以及数据的用户管理策略。确定脱敏对象:确定哪些是需要脱敏的敏感数据,以及脱敏数据的来源等。配置脱敏规则:根据不同的应用场景,不同的数据,采用适当的脱敏算法进行规制的配置。脱敏执行、数据验证:执行脱敏,之后通过工具和业务系统进行数据验证。制定行之有效的数据脱敏评价办法:组建评价团队,定期开展脱敏过程评价工作。明确评价范围,全面涵盖脱敏场景、脱敏技术、脱敏工具、执行人员等。制定评价指标,围绕敏感数据识别、脱敏权限分配、脱敏策略配置及执行、脱敏效果评估、脱敏数据标识、数据脱敏审计等过程的技术和安全要求,结合实际制定评价指标。选定评价方式,采用多种方式组合开展评价工作,包括资料查阅、人员访谈、功能演示、技术检测等。判定评价结果,收集并整理相关证明材料,组织召开相关会议确认评价结果,输出评价报告。 发布于 2022-10-27 13:48数据安全数据数据分析​赞同 6​​1 条评论​分享​喜欢​收藏​申请

sensitive-spring-boot-starter: 一款强大的数据脱敏插件,支持多种脱敏策略(中文姓名、身份证号、固定电话、手机号码、地址、电子邮箱、密码、车牌号、银行卡号...),支持自定义脱敏策略,支持自定义脱敏替换符,支持多层嵌套属性脱敏,支持在Controller上使用注解跳过脱敏...

sensitive-spring-boot-starter: 一款强大的数据脱敏插件,支持多种脱敏策略(中文姓名、身份证号、固定电话、手机号码、地址、电子邮箱、密码、车牌号、银行卡号...),支持自定义脱敏策略,支持自定义脱敏替换符,支持多层嵌套属性脱敏,支持在Controller上使用注解跳过脱敏...

登录

注册

开源

企业版

高校版

搜索

帮助中心

使用条款

关于我们

开源

企业版

高校版

私有云

Gitee AI

NEW

我知道了

查看详情

登录

注册

代码拉取完成,页面将自动刷新

捐赠

捐赠前请先登录

取消

前往登录

扫描微信二维码支付

取消

支付完成

支付提示

将跳转至支付宝完成支付

确定

取消

Watch

不关注

关注所有动态

仅关注版本发行动态

关注但不提醒动态

5

Star

53

Fork

25

lzhpo / sensitive-spring-boot-starter

代码

Issues

0

Pull Requests

0

Wiki

统计

流水线

服务

Gitee Pages

JavaDoc

质量分析

Jenkins for Gitee

腾讯云托管

腾讯云 Serverless

悬镜安全

阿里云 SAE

Codeblitz

我知道了,不再自动展开

加入 Gitee

与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)

免费加入

已有帐号?

立即登录

返回

master

管理

管理

分支 (2)

标签 (23)

master

springboot3

1.1.9

3.0.2

3.0.1

1.1.8

3.0.0

1.1.7

1.1.6

1.1.5

1.1.4

1.1.3

1.1.2

1.1.1

1.1.0

1.0.9

1.0.8

1.0.7

1.0.6

1.0.5

1.0.4

1.0.3

克隆/下载

克隆/下载

HTTPS

SSH

SVN

SVN+SSH

下载ZIP

登录提示

该操作需登录 Gitee 帐号,请先登录后再操作。

立即登录

没有帐号,去注册

提示

下载代码请复制以下命令到终端执行

为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置

git config --global user.name userName

git config --global user.email userEmail

初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置

1

生成 RSA 密钥

2

获取 RSA 公钥内容,并配置到 SSH公钥 中

在 Gitee 上使用 SVN,请访问 使用指南

使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作

Username for 'https://gitee.com': userName

Password for 'https://userName@gitee.com':

#

私人令牌

新建文件

新建 Diagram 文件

新建子模块

上传文件

分支 2

标签 23

贡献代码

同步代码

创建 Pull Request

了解更多

对比差异

通过 Pull Request 同步

同步更新到分支

通过 Pull Request 同步

将会在向当前分支创建一个 Pull Request,合入后将完成同步

lzhpo

Update README

67b78f0

105 次提交

提交

取消

提示:

由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件

.github/workflows

保存

取消

.mvn

保存

取消

docs/images

保存

取消

src

保存

取消

.codacy.yml

保存

取消

.gitignore

保存

取消

LICENSE

保存

取消

README.md

保存

取消

pom.xml

保存

取消

Loading...

README

Apache-2.0

开源地址

GitHub:https://github.com/lzhpo/sensitive-spring-boot-starter

Gitee:https://gitee.com/lzhpo/sensitive-spring-boot-starter

如何使用?

sensitive-spring-boot-starter也支持SpringBoot3

3.0.0及以上版本的sensitive-spring-boot-starter只针对使用SpringBoot3用户,SpringBoot2用户请使用低于3.0.0版本的sensitive-spring-boot-starter,两者功能不受影响,均会同步更新!

1.导入依赖

依赖已发布至Maven中央仓库,可直接引入依赖。

Maven:

com.lzhpo

sensitive-spring-boot-starter

${latest-version}

Gradle:

implementation 'com.lzhpo:sensitive-spring-boot-starter:${latest-version}'

2.实体类字段上使用@Sensitive注解配置脱敏规则

@Sensitive注解说明:

strategy:脱敏策略,支持12种脱敏策略。

replacer:脱敏策略的替换符,默认脱敏替换符为星号*,可以配置为任意字符。

比如:配置为#

@Sensitive(strategy = SensitiveStrategy.CHINESE_NAME, replacer = '#')

private String name;

2.1.支持的脱敏策略

以下数据均为随意构造的测试数据,如有相同,纯属巧合。

2.1.1 中文姓名

只显示第一个汉字,其他隐藏为2个星号。

@Sensitive(strategy = SensitiveStrategy.CHINESE_NAME)

private String name;

比如:刘子豪脱敏之后为刘**。

2.1.2 身份证号

保留前1位和后2位。

@Sensitive(strategy = SensitiveStrategy.ID_CARD)

private String idCard;

比如:530321199204074611脱敏之后为5***************11。

2.1.3 固定电话

保留前4位和后2位。

@Sensitive(strategy = SensitiveStrategy.FIXED_PHONE)

private String fixedPhone;

比如:01086551122脱敏之后为0108*****22。

2.1.4 手机号码

保留前3位和后4位。

@Sensitive(strategy = SensitiveStrategy.MOBILE_PHONE)

private String mobilePhone;

比如:13248765917脱敏之后为132****5917。

2.1.5 地址

只显示到地区,不显示详细地址,地址长度减去8即为前缀保留的长度,后缀均用星号代替。

@Sensitive(strategy = SensitiveStrategy.ADDRESS)

private String address;

比如:广州市天河区幸福小区102号脱敏之后为广州市天河区********。

2.1.6 电子邮箱

邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示。

@Sensitive(strategy = SensitiveStrategy.EMAIL)

private String email;

比如:example@gmail.com脱敏之后为e******@gmail.com。

2.1.7 密码

全部字符都用星号*代替。

@Sensitive(strategy = SensitiveStrategy.PASSWORD)

private String password;

比如:123456脱敏之后为******。

2.1.8 车牌号

车牌中间用星号*代替。

@Sensitive(strategy = SensitiveStrategy.CAR_LICENSE)

private String carLicense;

比如:粤A66666脱敏之后为粤A6***6。

2.1.9 银行卡号

保留前4位和后4位,中间的使用星号*代替,且中间的从第1位起,每隔4位添加一个空格用来美化。

@Sensitive(strategy = SensitiveStrategy.BANK_CARD)

private String bankCard;

例如:9988002866797031脱敏之后为9988 **** **** 7031。

2.2.1 自定义脱敏策略

当前支持三种风格的自定义脱敏策略:

保留前后缀脱敏策略。

敏感字符脱敏策略。

Handler脱敏策略。

2.2.1.1 保留前后缀脱敏策略

使用@Sensitive(strategy = SensitiveStrategy.CUSTOMIZE_KEEP_LENGTH)配合@SensitiveKeepLength一起使用。

@SensitiveFilterWords注解:

preKeep是字符串前置保留字符个数。

postKeep是字符串后置保留字符个数。

举个例子:name前后都只保留1个字符。

@Sensitive(strategy = SensitiveStrategy.CUSTOMIZE_KEEP_LENGTH)

@SensitiveKeepLength(preKeep = 1, postKeep = 1)

private String name;

如果name为1234,脱敏之后就是1**4。

2.2.1.2 敏感字符脱敏策略

使用@Sensitive(strategy = SensitiveStrategy.CUSTOMIZE_FILTER_WORDS)配合@SensitiveFilterWords一起使用。

@SensitiveFilterWords注解:定义敏感字符。

举个例子:脏话关键字脱敏。

@Sensitive(strategy = SensitiveStrategy.CUSTOMIZE_FILTER_WORDS)

@SensitiveFilterWords({"他妈的", "去你大爷", "卧槽", "草泥马", "废物"})

private String description;

如果description的值为卧槽,他妈的,我去你大爷的,草泥马,脱敏之后就是**,***,我****的,***。

2.2.1.3 Handler脱敏策略

Handler脱敏策略完全由开发者进行处理,不受@Sensitive注解上的replacer脱敏替换符影响。

使用@Sensitive(strategy = SensitiveStrategy.CUSTOMIZE_HANDLER)配合@SensitiveHandler一起使用。

@SensitiveHandler注解:表示处理脱敏的Handler。

例如:将name字段都设置为@#@。

@Sensitive(strategy = SensitiveStrategy.CUSTOMIZE_HANDLER)

@SensitiveHandler(FaceCustomizeSensitiveHandler.class)

private String name;

public class FaceCustomizeSensitiveHandler implements CustomizeSensitiveHandler {

@Override

public String customize(SensitiveWrapper sensitiveWrapper) {

// 字段

Field field = sensitiveWrapper.getField();

// 字段归属的对象

Class objectClass = field.getDeclaringClass();

// 字段上的注解

Annotation[] annotations = field.getAnnotations();

// 字段值

String fieldValue = sensitiveWrapper.getFieldValue();

// 注解信息

Sensitive sensitive = sensitiveWrapper.getSensitive();

return "@#@";

}

}

可以看到,提供了含有@Sensitive注解的字段、字段值、字段归属的对象、注解的信息等等供开发者定制。

3.使用@IgnoreSensitive注解标注在controller上可忽略脱敏

如果实体类标注了@Sensitive脱敏,被多个接口共用的,接口A要脱敏,但是接口B不需要脱敏,就可以使用@IgnoreSensitive注解忽略脱敏,同时也支持忽略指定字段脱敏。

1.在Controller类上使用@IgnoreSensitive表示此类下所有接口都忽略脱敏

此controller下的所有接口都将忽略脱敏。

@RestController

@IgnoreSensitive

@RequestMapping("/ignore")

public class NoSensitiveController {

@GetMapping("sample3")

public ResponseEntity sample3() {

return ResponseEntity.ok(SampleJavaBeanMock.sampleJavaBean());

}

@GetMapping("sample4")

public ResponseEntity sample4() {

return ResponseEntity.ok(SampleJavaBeanMock.sampleJavaBean());

}

}

2.在Controller的方法中使用@IgnoreSensitive表示此接口忽略脱敏

@RestController

@RequestMapping("/")

public class SensitiveController {

@GetMapping("sample1")

public ResponseEntity sample1() {

return ResponseEntity.ok(SampleJavaBeanMock.sampleJavaBean());

}

@IgnoreSensitive

@GetMapping("ignore/sample2")

public ResponseEntity sample2() {

return ResponseEntity.ok(SampleJavaBeanMock.sampleJavaBean());

}

}

sample2将忽略SampleJavaBean对象的字段脱敏,sample1不影响。

3.在Controller的类或方法中使用@IgnoreSensitive忽略指定字段脱敏

示例:忽略脱敏SampleJavaBean中的name和email字段的脱敏。

@RestController

@RequestMapping("/")

public class SensitiveController {

@IgnoreSensitive({"name", "email"})

@GetMapping("ignore/sample")

public ResponseEntity sample() {

return ResponseEntity.ok(SampleJavaBeanMock.sampleJavaBean());

}

}

注意事项

1.有关单独使用@Builder/@SuperBuilder注解、实体类多层嵌套问题

需要数据脱敏的实体类以及嵌套类都应提供对应成员变量的get方法,否则JSON组件无法获取到嵌套的成员变量进行脱敏!

错误示范:嵌套对象单独使用一个@Builder/@SuperBuilder

正确示范:如果需要使用到@Builder/@SuperBuilder,那么需要配合@Data或@Getter一起使用。

例如:

@Data

@Builder

@NoArgsConstructor

@AllArgsConstructor

public class SensitiveEntity {

@Sensitive(strategy = SensitiveStrategy.CHINESE_NAME)

private String name;

@Sensitive(strategy = SensitiveStrategy.ID_CARD)

private String idCard;

}

2.将默认的Jackson切换为FastJson(不推荐)

加入FastJson依赖(支持FastJson1和FastJson2):

com.alibaba

fastjson

1.x.x/2.x.x

将FastJsonHttpMessageConverter声明为Bean即可,sensitive-spring-boot-starter会自动注入相关逻辑。

@Bean

public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {

return new FastJsonHttpMessageConverter();

}

3.关闭此数据脱敏功能

移除此maven依赖即可

公众号

微信

公众号

Apache License

Version 2.0, January 2004

http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction,

and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by

the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all

other entities that control, are controlled by, or are under common

control with that entity. For the purposes of this definition,

"control" means (i) the power, direct or indirect, to cause the

direction or management of such entity, whether by contract or

otherwise, or (ii) ownership of fifty percent (50%) or more of the

outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity

exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications,

including but not limited to software source code, documentation

source, and configuration files.

"Object" form shall mean any form resulting from mechanical

transformation or translation of a Source form, including but

not limited to compiled object code, generated documentation,

and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or

Object form, made available under the License, as indicated by a

copyright notice that is included in or attached to the work

(an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object

form, that is based on (or derived from) the Work and for which the

editorial revisions, annotations, elaborations, or other modifications

represent, as a whole, an original work of authorship. For the purposes

of this License, Derivative Works shall not include works that remain

separable from, or merely link (or bind by name) to the interfaces of,

the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including

the original version of the Work and any modifications or additions

to that Work or Derivative Works thereof, that is intentionally

submitted to Licensor for inclusion in the Work by the copyright owner

or by an individual or Legal Entity authorized to submit on behalf of

the copyright owner. For the purposes of this definition, "submitted"

means any form of electronic, verbal, or written communication sent

to the Licensor or its representatives, including but not limited to

communication on electronic mailing lists, source code control systems,

and issue tracking systems that are managed by, or on behalf of, the

Licensor for the purpose of discussing and improving the Work, but

excluding communication that is conspicuously marked or otherwise

designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity

on behalf of whom a Contribution has been received by Licensor and

subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of

this License, each Contributor hereby grants to You a perpetual,

worldwide, non-exclusive, no-charge, royalty-free, irrevocable

copyright license to reproduce, prepare Derivative Works of,

publicly display, publicly perform, sublicense, and distribute the

Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of

this License, each Contributor hereby grants to You a perpetual,

worldwide, non-exclusive, no-charge, royalty-free, irrevocable

(except as stated in this section) patent license to make, have made,

use, offer to sell, sell, import, and otherwise transfer the Work,

where such license applies only to those patent claims licensable

by such Contributor that are necessarily infringed by their

Contribution(s) alone or by combination of their Contribution(s)

with the Work to which such Contribution(s) was submitted. If You

institute patent litigation against any entity (including a

cross-claim or counterclaim in a lawsuit) alleging that the Work

or a Contribution incorporated within the Work constitutes direct

or contributory patent infringement, then any patent licenses

granted to You under this License for that Work shall terminate

as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the

Work or Derivative Works thereof in any medium, with or without

modifications, and in Source or Object form, provided that You

meet the following conditions:

(a) You must give any other recipients of the Work or

Derivative Works a copy of this License; and

(b) You must cause any modified files to carry prominent notices

stating that You changed the files; and

(c) You must retain, in the Source form of any Derivative Works

that You distribute, all copyright, patent, trademark, and

attribution notices from the Source form of the Work,

excluding those notices that do not pertain to any part of

the Derivative Works; and

(d) If the Work includes a "NOTICE" text file as part of its

distribution, then any Derivative Works that You distribute must

include a readable copy of the attribution notices contained

within such NOTICE file, excluding those notices that do not

pertain to any part of the Derivative Works, in at least one

of the following places: within a NOTICE text file distributed

as part of the Derivative Works; within the Source form or

documentation, if provided along with the Derivative Works; or,

within a display generated by the Derivative Works, if and

wherever such third-party notices normally appear. The contents

of the NOTICE file are for informational purposes only and

do not modify the License. You may add Your own attribution

notices within Derivative Works that You distribute, alongside

or as an addendum to the NOTICE text from the Work, provided

that such additional attribution notices cannot be construed

as modifying the License.

You may add Your own copyright statement to Your modifications and

may provide additional or different license terms and conditions

for use, reproduction, or distribution of Your modifications, or

for any such Derivative Works as a whole, provided Your use,

reproduction, and distribution of the Work otherwise complies with

the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,

any Contribution intentionally submitted for inclusion in the Work

by You to the Licensor shall be under the terms and conditions of

this License, without any additional terms or conditions.

Notwithstanding the above, nothing herein shall supersede or modify

the terms of any separate license agreement you may have executed

with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade

names, trademarks, service marks, or product names of the Licensor,

except as required for reasonable and customary use in describing the

origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or

agreed to in writing, Licensor provides the Work (and each

Contributor provides its Contributions) on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or

implied, including, without limitation, any warranties or conditions

of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A

PARTICULAR PURPOSE. You are solely responsible for determining the

appropriateness of using or redistributing the Work and assume any

risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,

whether in tort (including negligence), contract, or otherwise,

unless required by applicable law (such as deliberate and grossly

negligent acts) or agreed to in writing, shall any Contributor be

liable to You for damages, including any direct, indirect, special,

incidental, or consequential damages of any character arising as a

result of this License or out of the use or inability to use the

Work (including but not limited to damages for loss of goodwill,

work stoppage, computer failure or malfunction, or any and all

other commercial damages or losses), even if such Contributor

has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing

the Work or Derivative Works thereof, You may choose to offer,

and charge a fee for, acceptance of support, warranty, indemnity,

or other liability obligations and/or rights consistent with this

License. However, in accepting such obligations, You may act only

on Your own behalf and on Your sole responsibility, not on behalf

of any other Contributor, and only if You agree to indemnify,

defend, and hold each Contributor harmless for any liability

incurred by, or claims asserted against, such Contributor by reason

of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following

boilerplate notice, with the fields enclosed by brackets "[]"

replaced with your own identifying information. (Don't include

the brackets!) The text should be enclosed in the appropriate

comment syntax for the file format. We also recommend that a

file or class name and description of purpose be included on the

same "printed page" as the copyright notice for easier

identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

Starred

53

Star

53

Fork

25

捐赠

0 人次

举报

举报成功

我们将于2个工作日内通过站内信反馈结果给你!

请认真填写举报原因,尽可能描述详细。

举报类型

请选择举报类型

举报原因

取消

发送

误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消

提交

简介

一款强大的数据脱敏插件,支持多种脱敏策略(中文姓名、身份证号、固定电话、手机号码、地址、电子邮箱、密码、车牌号、银行卡号...),支持自定义脱敏策略,支持自定义脱敏替换符,支持多层嵌套属性脱敏,支持在Controller上使用注解跳过脱敏...

展开

收起

暂无标签

http://www.lzhpo.com

Java

Java

100.0%

Apache-2.0

使用 Apache-2.0 开源许可协议

保存更改

取消

发行版

(23)

全部

1.1.9

贡献者

全部

近期动态

加载更多

不能加载更多了

编辑仓库简介

简介内容

一款强大的数据脱敏插件,支持多种脱敏策略(中文姓名、身份证号、固定电话、手机号码、地址、电子邮箱、密码、车牌号、银行卡号...),支持自定义脱敏策略,支持自定义脱敏替换符,支持多层嵌套属性脱敏,支持在Controller上使用注解跳过脱敏...

主页

取消

保存更改

Java

1

https://gitee.com/lzhpo/sensitive-spring-boot-starter.git

git@gitee.com:lzhpo/sensitive-spring-boot-starter.git

lzhpo

sensitive-spring-boot-starter

sensitive-spring-boot-starter

master

深圳市奥思网络科技有限公司版权所有

Git 大全

Git 命令学习

CopyCat 代码克隆检测

APP与插件下载

Gitee Reward

Gitee 封面人物

GVP 项目

Gitee 博客

Gitee 公益计划

Gitee 持续集成

OpenAPI

帮助文档

在线自助服务

更新日志

关于我们

加入我们

使用条款

意见建议

合作伙伴

售前咨询客服

技术交流QQ群

微信服务号

client#oschina.cn

企业版在线使用:400-606-0201

专业版私有部署:

13670252304

13352947997

开放原子开源基金会

合作代码托管平台

违法和不良信息举报中心

粤ICP备12009483号

简 体

/

繁 體

/

English

点此查找更多帮助

搜索帮助

Git 命令在线学习

如何在 Gitee 导入 GitHub 仓库

Git 仓库基础操作

企业版和社区版功能对比

SSH 公钥设置

如何处理代码冲突

仓库体积过大,如何减小?

如何找回被删除的仓库数据

Gitee 产品配额说明

GitHub仓库快速导入Gitee及同步更新

什么是 Release(发行版)

将 PHP 项目自动发布到 packagist.org

评论

仓库举报

回到顶部

登录提示

该操作需登录 Gitee 帐号,请先登录后再操作。

立即登录

没有帐号,去注册

数据脱敏的常用方法及工具? - 知乎

数据脱敏的常用方法及工具? - 知乎切换模式写文章登录/注册数据脱敏的常用方法及工具?snpgroupSNP全球领先的标准化软件和咨询服务提供商数据脱敏的常见方式有哪些?在数据脱敏的过程中,需要根据不同的数据使用场景,选择相应的数据脱敏方式。较为常见数据脱敏方式包括以下几种:■ 掩码屏蔽:使用*掩盖部分数据,如保留身份证前6位代表地区信息的数字,其余用*代替,被掩码屏蔽的部分可以根据需要进行调整。■ 随机化:使用随机数据代替真实值,如随机生成客户姓名代替真实值。■ 数据替换:使用虚拟值替换真实值,如设置一个常数,将所有手机号统一替换为“13100220002”。■ 泛化:在保留数据局部特征的情况下,对数值型字段进行归类后替换原有数值,使原有数据特征被模糊化。如根据借记卡余额数值分为 “<5万”, “5-10万”, “10-15万”等区间,并将其替换原有的借记卡余额数据。■ 截断:13100220002 截断为 131,舍弃必要信息来保证数据的模糊性。■ 平均值:针对数值型数据,计算它们的平均值后,将脱敏值在均值附近随机分布,在改变数值的情况下不改变数据总值和均值。■ 偏移取整:将数据中的数字随机进行位移,从而改变原始数据。以开户时间为例,经过偏移取整后,开户时间2015-07-26 15:03:24变成了2017-06-25 15:00:00。数据脱敏的工具——SNP测试数据管理器(Test Data Organizer)SNP测试数据管理器有强大的脱敏框架,包括针对SAP ERP、SAP S/4HANA®、SAP CRM、SAP SRM、SAP HCM的预定义脱敏内容,具有大量预先配置脱敏规则的标准对象(e.g. vendors, customers),子对象 (e.g.name and address data, bank data, communication data, etc.),通过SNP的预定义标准规则进行数据脱敏,预定义的内容可以灵活地根据客户需求进行扩展。在数据测试期间保护敏感数据,确保遵守数据保护/GDPR法规。发布于 2022-08-04 23:19数据安全数据脱敏数据迁移​赞同 3​​添加评论​分享​喜欢​收藏​申请

数据脱敏是什么? - 知乎

数据脱敏是什么? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册数据数据分析工具互联网数据分析数据脱敏是什么?关注者131被浏览473,348关注问题​写回答​邀请回答​好问题 7​添加评论​分享​30 个回答默认排序华为云开发者联盟​已认证账号​ 关注大数据时代的到来,颠覆了传统业态的运作模式,激发出新的生产潜能。数据成为重要的生产要素,是信息的载体,数据间的流动也潜藏着更高阶维度的价值信息。对于数据控制者和数据处理者而言,如何最大化数据流动的价值,是数据挖掘的初衷和意义。然而,一系列信息泄露事件的曝光,使得数据安全越来越受到广泛的关注。什么是数据脱敏?数据脱敏(Data Masking),顾名思义,是屏蔽敏感数据,对某些敏感信息(比如,身份证号、手机号、卡号、客户姓名、客户地址、邮箱地址、薪资等等 )通过脱敏规则进行数据的变形,实现隐私数据的可靠保护。业界常见的脱敏规则有,替换、重排、加密、截断、掩码,用户也可以根据期望的脱敏算法自定义脱敏规则。通常,良好的数据脱敏实施,需要遵循如下两个原则,第一,尽可能地为脱敏后的应用,保留脱敏前的有意义信息;第二,最大程度地防止黑客进行破解。数据脱敏分为静态数据脱敏和动态数据脱敏。静态数据脱敏,是数据的“搬移并仿真替换”,是将数据抽取进行脱敏处理后,下发给下游环节,随意取用和读写的,脱敏后数据与生产环境相隔离,满足业务需求的同时保障生产数据库的安全。动态数据脱敏,在访问敏感数据的同时实时进行脱敏处理,可以为不同角色、不同权限、不同数据类型执行不同的脱敏方案,从而确保返回的数据可用而安全。GaussDB (DWS)的数据脱敏功能,摒弃业务应用层脱敏依赖性高、代价大等痛点,将数据脱敏内化为数据库产品自身的安全能力,提供了一套完整、安全、灵活、透明、友好的数据脱敏解决方案,属于动态数据脱敏。用户识别敏感字段后,基于目标字段,绑定内置脱敏函数,即可创建脱敏策略。脱敏策略(Redaction Policy)与表对象是一一对应的。一个脱敏策略包含表对象、生效条件、脱敏列-脱敏函数对三个关键要素,是该表对象上所有脱敏列的集合,不同字段可以根据数据特征采用不同的脱敏函数。当且仅当生效条件为真时,查询语句才会触发敏感数据的脱敏,而脱敏过程是内置在SQL引擎内部实现的,对生成环境用户是透明不可见的。怎么用数据脱敏?动态数据脱敏,是在查询语句执行过程中,根据生效条件是否满足,实现实时的脱敏处理。生效条件,通常是针对当前用户角色的判断。敏感数据的可见范围,即是针对不同用户预设的。系统管理员,具有最高权限,任何时刻对任何表的任何字段都可见。确定受限制用户角色,是创建脱敏策略的第一步。敏感信息依赖于实际业务场景和安全维度,以自然人为例,用户个体的敏感字段包括:姓名、身份证号、手机号、邮箱地址等等;在银行系统,作为客户,可能还涉及银行卡号、过期时间、支付密码等等;在公司系统,作为员工,可能还涉及薪资、教育背景等;在医疗系统,作为患者,可能还涉及就诊信息等等。所以,识别和梳理具体业务场景的敏感字段,是创建脱敏策略的第二步。产品内置一系列常见的脱敏函数接口,可以针对不同数据类型和数据特征,指定参数,从而达到不一样的脱敏效果。脱敏函数可采用如下三种内置接口,同时支持自定义脱敏函数。三种内置脱敏函数能够涵盖大部分场景的脱敏效果,不推荐使用自定义脱敏函数。MASK_NONE:不作脱敏处理,仅内部测试用。MASK_FULL:全脱敏成固定值。MASK_PARTIAL:使用指定的脱敏字符对脱敏范围内的内容做部分脱敏。不同脱敏列可以采用不同的脱敏函数。比如,手机号通常显示后四位尾号,前面用"*"替换;金额统一显示为固定值0,等等。确定脱敏列需要绑定的脱敏函数,是创建脱敏策略的第三步。以某公司员工表emp,表的属主用户alice以及用户matu、july为例,简单介绍数据脱敏的使用过程。其中,表emp包含员工的姓名、手机号、邮箱、发薪卡号、薪资等隐私数据,用户alice是人力资源经理,用户matu和july是普通职员。假设表、用户及用户对表emp的查看权限均已就绪。(1)创建脱敏策略mask_emp,仅允许alice查看员工所有信息,matu和july对发薪卡号、薪资均不可见。字段card_no是数值类型,采用MASK_FULL全脱敏成固定值0;字段card_string是字符类型,采用MASK_PARTIAL按指定的输入输出格式对原始数据作部分脱敏;字段salary是数值类型,采用数字9部分脱敏倒数第二位前的所有数位值。postgres=# CREATE REDACTION POLICY mask_emp ON emp WHEN (current_user != 'alice')

ADD COLUMN card_no WITH mask_full(card_no),

ADD COLUMN card_string WITH mask_partial(card_string, 'VVVVFVVVVFVVVVFVVVV','VVVV-VVVV-VVVV-VVVV','#',1,12),

ADD COLUMN salary WITH mask_partial(salary, '9', 1, length(salary) - 2);切换到matu和july,查看员工表emp。postgres=> SET ROLE matu PASSWORD 'Gauss@123';

postgres=> SELECT * FROM emp;

id | name | phone_no | card_no | card_string | email | salary | birthday

----+------+-------------+---------+---------------------+----------------------+------------+---------------------

1 | anny | 13420002340 | 0 | ####-####-####-1234 | smithWu@163.com | 99999.9990 | 1999-10-02 00:00:00

2 | bob | 18299023211 | 0 | ####-####-####-3456 | 66allen_mm@qq.com | 9999.9990 | 1989-12-12 00:00:00

3 | cici | 15512231233 | | | jonesishere@sina.com | | 1992-11-06 00:00:00

(3 rows)

postgres=> SET ROLE july PASSWORD 'Gauss@123';

postgres=> SELECT * FROM emp;

id | name | phone_no | card_no | card_string | email | salary | birthday

----+------+-------------+---------+---------------------+----------------------+------------+---------------------

1 | anny | 13420002340 | 0 | ####-####-####-1234 | smithWu@163.com | 99999.9990 | 1999-10-02 00:00:00

2 | bob | 18299023211 | 0 | ####-####-####-3456 | 66allen_mm@qq.com | 9999.9990 | 1989-12-12 00:00:00

3 | cici | 15512231233 | | | jonesishere@sina.com | | 1992-11-06 00:00:00

(3 rows)(2)由于工作调整,matu进入人力资源部参与公司招聘事宜,也对员工所有信息可见,修改策略生效条件。postgres=> ALTER REDACTION POLICY mask_emp ON emp WHEN(current_user NOT IN ('alice', 'matu'));切换到用户matu和july,重新查看员工表emp。postgres=> SET ROLE matu PASSWORD 'Gauss@123';

postgres=> SELECT * FROM emp;

id | name | phone_no | card_no | card_string | email | salary | birthday

----+------+-------------+------------------+---------------------+----------------------+------------+---------------------

1 | anny | 13420002340 | 1234123412341234 | 1234-1234-1234-1234 | smithWu@163.com | 10000.0000 | 1999-10-02 00:00:00

2 | bob | 18299023211 | 3456345634563456 | 3456-3456-3456-3456 | 66allen_mm@qq.com | 9999.9900 | 1989-12-12 00:00:00

3 | cici | 15512231233 | | | jonesishere@sina.com | | 1992-11-06 00:00:00

(3 rows)

postgres=> SET ROLE july PASSWORD 'Gauss@123';

postgres=> SELECT * FROM emp;

id | name | phone_no | card_no | card_string | email | salary | birthday

----+------+-------------+---------+---------------------+----------------------+------------+---------------------

1 | anny | 13420002340 | 0 | ####-####-####-1234 | smithWu@163.com | 99999.9990 | 1999-10-02 00:00:00

2 | bob | 18299023211 | 0 | ####-####-####-3456 | 66allen_mm@qq.com | 9999.9990 | 1989-12-12 00:00:00

3 | cici | 15512231233 | | | jonesishere@sina.com | | 1992-11-06 00:00:00

(3 rows)(3)员工信息phone_no、email和birthday也是隐私数据,更新脱敏策略mask_emp,新增三个脱敏列。postgres=> ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN phone_no WITH mask_partial(phone_no, '*', 4);

postgres=> ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN email WITH mask_partial(email, '*', 1, position('@' in email));

postgres=> ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN birthday WITH mask_full(birthday);切换到用户july,查看员工表emp。postgres=> SET ROLE july PASSWORD 'Gauss@123';

postgres=> SELECT * FROM emp;

id | name | phone_no | card_no | card_string | email | salary | birthday

----+------+-------------+---------+---------------------+----------------------+------------+---------------------

1 | anny | 134******** | 0 | ####-####-####-1234 | ********163.com | 99999.9990 | 1970-01-01 00:00:00

2 | bob | 182******** | 0 | ####-####-####-3456 | ***********qq.com | 9999.9990 | 1970-01-01 00:00:00

3 | cici | 155******** | | | ************sina.com | | 1970-01-01 00:00:00

(3 rows)(4)考虑用户交互的友好性,GaussDB (DWS) 提供系统视图redaction_policies和redaction_columns,方便用户直接查看更多脱敏信息。postgres=> SELECT * FROM redaction_policies;

object_schema | object_owner | object_name | policy_name | expression | enable | policy_description

---------------+--------------+-------------+-------------+-----------------------------------+--------+--------------------

public | alice | emp | mask_emp | ("current_user"() = 'july'::name) | t |

(1 row)

postgres=> SELECT object_name, column_name, function_info FROM redaction_columns;

object_name | column_name | function_info

-------------+-------------+-------------------------------------------------------------------------------------------------------

emp | card_no | mask_full(card_no)

emp | card_string | mask_partial(card_string, 'VVVVFVVVVFVVVVFVVVV'::text, 'VVVV-VVVV-VVVV-VVVV'::text, '#'::text, 1, 12)

emp | email | mask_partial(email, '*'::text, 1, "position"(email, '@'::text))

emp | salary | mask_partial(salary, '9'::text, 1, (length((salary)::text) - 2))

emp | birthday | mask_full(birthday)

emp | phone_no | mask_partial(phone_no, '*'::text, 4)

(6 rows)(5)突然某一天,公司内部可共享员工信息时,直接删除表emp的脱敏策略mask_emp即可。postgres=> DROP REDACTION POLICY mask_emp ON emp;更多用法详情,请参考GaussDB (DWS) 8.1.1产品文档。数据脱敏实现背后的秘密GaussDB (DWS)数据脱敏功能,基于SQL引擎既有的实现框架,在受限用户执行查询语句过程中,实现外部不感知的实时脱敏处理。关于其内部实现,如上图所示。我们将脱敏策略(Redaction Policy)视为表对象上绑定的规则,在优化器查询重写阶段,遍历Query Tree中TargetList的每个TargetEntry,如若涉及基表的某个脱敏列,且当前脱敏规则生效(即满足脱敏策略的生效条件且enable开启状态),则断定此TargetEntry中涉及要脱敏的Var对象,此时,遍历脱敏列系统表pg_redaction_column,查找到对应脱敏列绑定的脱敏函数,将其替换成对应的FuncExpr即可。经过上述对Query Tree的重写处理,优化器会自动生成新的执行计划,执行器遵照新的计划执行,查询结果将对敏感数据做脱敏处理。带有数据脱敏的语句执行,相较于原始语句,增加了数据脱敏的逻辑处理,势必会给查询带来额外的开销。这部分开销,主要受表的数据规模、查询目标列涉及的脱敏列数、脱敏列采用的脱敏函数三方面因素影响。针对简单查询语句,以tpch表customer为例,针对上述因素展开测试,如下图所示。图(a)、(b)中基表customer根据字段类型和特征,既有采用MASK_FULL脱敏函数的,也有采用MASK_PARTIAL脱敏函数的。MASK_FULL对于任何长度和类型的原始数据,均只脱敏成固定值,所以,输出结果相较于原始数据,差异很大。图(a)显示不同数据规模下,脱敏和非脱敏场景简单查询语句的执行耗时。实心图标为非脱敏场景,空心图标为被限制用户,即脱敏场景。可见,数据规模越大,带有脱敏的查询耗时与原始语句差异越大。图(b)显示10x数据规模下查询涉及脱敏列数不同对于语句执行性能的影响。涉及1列脱敏列时,带有脱敏的查询比原始语句慢,追溯发现,此列采用的是MASK_PARTIAL部分脱敏函数,查询结果只是改变了结果的格式,结果内容的长度并未变化,符合“带有脱敏的语句执行会有相应的性能劣化”的理论猜想。随着查询涉及脱敏列数的增加,我们发现一个奇怪的现象,脱敏场景反倒比原始语句执行更快。进一步追溯多列场景下脱敏列关联的脱敏函数,发现,正是因为存在使用MASK_FULL全脱敏函数的脱敏列,导致输出结果集部分相比原始数据节省很多时间开销,从而多列查询下带有数据脱敏的简单查询反倒提速不少。为了佐证上述猜测,我们调整脱敏函数,所有脱敏列均采用MASK_PARTIAL对原始数据做部分脱敏,从而能够在脱敏结果上保留原始数据的外部可读性。于是,如图(c)所示,当脱敏列均关联部分脱敏函数时,带有数据脱敏的语句比原始语句劣化10%左右,理论上讲,这种劣化是在可接受范围的。上述测试仅针对简单的查询语句,当语句复杂到带有聚集函数或复杂表达式运算时,可能这种性能劣化会更明显。总结GaussDB (DWS)产品数据脱敏功能,是数据库产品内化和夯实数据安全能力的重要技术突破,主要涵盖以下三个方面:一套简单、易用的数据脱敏策略语法;一系列可覆盖常见隐私数据脱敏效果的、灵活配置的内置脱敏函数;一个完备、便捷的脱敏策略应用方案,使得原始语句在执行过程中可以实时、透明、高效地实现脱敏。总而言之,此数据脱敏功能可以充分满足客户业务场景的数据脱敏诉求,支持常见隐私数据的脱敏效果,实现敏感数据的可靠保护。点击关注,第一时间了解华为云新鲜技术~发布于 2021-04-17 15:57​赞同 44​​添加评论​分享​收藏​喜欢收起​首席数据科学家​ 关注“ 今天和大家聊聊在数据工作中的常见场景:脱敏。”数据安全,一向是我们做数据的同学所必须关注的。我们之前分享过《数据安全治理》、《个保法施行的影响》、《联邦学习》等文章。今天我们聊一聊关于数据的脱敏。一、数据脱敏的基础概念所谓的数据脱敏,是指在不影响数据分析结果的准确性前提下,对原始数据中的敏感字段进行处理,从而降低数据敏感度和减少个人隐私风险的技术措施。具体效果上,主要是去标识化和匿名化。去标识化:是指通过对个人信息的技术处理,使得在不借助额外信息的情况下,无法识别个人信息主体匿名化:是指通过对个人信息的技术处理,使得个人信息主体无法被识别或关联,且处理后的信息不能被还原的过程二、常见的脱敏场景企业内部常见的数据脱敏场景主要包括数据报告脱敏、应用系统脱敏、数据库脱敏等。(1)静态(数据文件)脱敏适用于批量进行脱敏数据。比如用于模型训练的测试数据,再比如数据的导出用于离线数据分析。(2)动态(数据库)脱敏动态数据脱敏主要指的是数据库脱敏。具体而言,指的是比如研发人员的开发调试、DBA日常数据管理、运维人员基础运维等。(3)应用系统脱敏应用系统脱敏主要指的是前端页面的敏感数据脱敏,以及数据类型接口API的透出数据脱敏。(4)数据报告及数据产品脱敏这类场景主要包括内部的数据监控类产品或者看板、对外服务的数据类产品、基于数据分析的报告,比如业务汇报、项目复盘三、常用的脱敏技术方法常见的数据脱敏技术主要包括以下几类。(1)统计技术统计技术是一种对数据集进行去标识化的常用方法,主要包括数据抽样和数据聚合两种技术。数据抽样:是通过选取数据集中有代表性的⼦集来对原始数据集进⾏分析和评估的,它是提升去标识化技术有效性的重要⽅法。数据聚合:作为⼀系列统计技术(如求和、计数、平均、最⼤值与最⼩值)的集合,应⽤于微数据中的属性时,产⽣的结果能够代表原始数据集中的所有记录。(2)密码技术密码技术是去标识化或提升去标识化技术有效性的常⽤⽅法,采⽤不同类型的加密算法所能达到不同的脱敏效果。确定性加密:⼀种⾮随机对称加密,常见对id类数据进⾏处理,可在必要时对密⽂进⾏解密还原为原id,但需要对密钥进⾏妥善保护。不可逆加密:通常散列(hash)函数对数据进⾏处理,常见于对id类数据进⾏处理,不可以直接解密,需保存映射关系,同时因为hash函数特性,会存在数据碰撞的问题,⽤法简单,不⽤担⼼密钥保护。同态加密:⽤密⽂同态算法,其特点是密⽂运算的结果解密之后和明⽂运算相同,因此常见于对数值类字段进⾏处理,但性能原因,⽬前未⼤范围使⽤。(3)抑制技术抑制技术即对不满⾜隐私保护的数据项删除或屏蔽,不进⾏发布。屏蔽:是指对属性值进行屏蔽,最常见的脱敏方式,如对手机号、身份证进行打*号处理,或对于地址采取截断的方式;局部抑制:是指删除特定的属性值(列)的处理方式,删除非必要的数据字段;记录抑制:是指删除特定的记录(行)的处理方式,删除非必要的数据记录。(4)假名化技术假名化技术是⼀种使⽤假名替换直接标识(或其它敏感标识符)的去标识化技术。假名化技术为每⼀个⼈信息主体创建唯⼀的标识符,以取代原来的直接标识或敏感标识符。可以独⽴⽣成随机值对原始ID进⾏对应,并保存映射关系表,同时对映射关系表的访问进⾏严格控制;同样可以采⽤加密的⽅式⽣产假名,但需为妥善保存解密密钥;该技术⼴泛使⽤在数据使⽤⽅数量多且相互独⽴的情况,⽐如开放平台场景的openid,同样⼀个⽤户,不同开发者获取的openid不同。(5)泛化技术泛化技术是指⼀种降低数据集中所选属性粒度的去标识化技术,对数据进⾏更概括、抽象的描述。泛化技术实现简单,能保护记录级数据的真实性,常见于数据产品或数据报告中。取整:涉及到为所选的属性选定⼀个取整基数,⽐如向上或向下取证,产出结果100、500、1k、10k顶层与底层编码技术:使⽤表⽰顶层(或底层)的阈值替换⾼于(或低于)该阈值的值,产出结果为 “⾼于X”或 “低于X”(6)随机化技术随机化技术作为⼀种去标识化技术类别,指通过随机化修改属性的值,使得随机化处理后的值区别于原来的真实值。该过程降低了攻击者从同⼀数据记录中根据其它属性值推导出某⼀属性值的能⼒,但会影响结果数据的真实性,常见于⽣产测试数据。关于数据脱敏,今天主要就分享这些内容,欢迎朋友们继续关注。发布于 2022-05-25 22:04​赞同 115​​添加评论​分享​收藏​喜欢