首页 文章 精选 留言 我的

精选列表

搜索[应用合规平台],共10011篇文章
优秀的个人博客,低调大师

【架构实战】数据脱敏与隐私保护:合规是底线

## 一、日志里打印了用户手机号,被安全部门约谈 2021年,安全部门扫描发现我们的日志里明文打印了用户手机号和身份证号。 根据《个人信息保护法》,这属于违规行为。我们被要求限期整改,否则面临罚款。 从那以后,数据脱敏成了我们的必修课。 --- ## 二、脱敏规则 ```java /** * 脱敏工具类 */ public class MaskUtils { /** 手机号脱敏:138****1234 */ public static String maskPhone(String phone) { if (phone == null || phone.length() ) result) { maskSensitiveFields(item); } } else if (result != null) { maskSensitiveFields(result); } return result; } private void maskSensitiveFields(Object obj) { if (obj == null) return; for (Field field : obj.getClass().getDeclaredFields()) { Sensitive sensitive = field.getAnnotation(Sensitive.class); if (sensitive != null && field.getType() == String.class) { field.setAccessible(true); try { String value = (String) field.get(obj); if (value != null) { field.set(obj, maskByType(value, sensitive.type())); } } catch (IllegalAccessException e) { // ignore } } } } private String maskByType(String value, SensitiveType type) { switch (type) { case PHONE: return MaskUtils.maskPhone(value); case ID_CARD: return MaskUtils.maskIdCard(value); case EMAIL: return MaskUtils.maskEmail(value); case NAME: return MaskUtils.maskName(value); case BANK_CARD: return MaskUtils.maskBankCard(value); case ADDRESS: return MaskUtils.maskAddress(value); default: return value; } } } /** * 敏感字段注解 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Sensitive { SensitiveType type(); } // 使用 @Data public class UserVO { private Long id; private String username; @Sensitive(type = SensitiveType.PHONE) private String phone; @Sensitive(type = SensitiveType.ID_CARD) private String idCard; @Sensitive(type = SensitiveType.EMAIL) private String email; } ``` --- ## 三、日志脱敏 ```java /** * 日志脱敏拦截器 */ @Component public class LogMaskFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper((HttpServletRequest) request); chain.doFilter(wrappedRequest, response); // 日志中记录请求体(脱敏后) String body = new String(wrappedRequest.getContentAsByteArray()); String masked = maskSensitiveData(body); log.info("Request: uri={}, body={}", ((HttpServletRequest) request).getRequestURI(), masked); } private String maskSensitiveData(String data) { // 正则匹配手机号 data = data.replaceAll("(1[3-9]\\d)\\d{4}(\\d{4})", "$1****$2"); // 正则匹配身份证号 data = data.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1**********$2"); // 正则匹配邮箱 data = data.replaceAll("(\\w)\\w+(@\\w+\\.\\w+)", "$1***$2"); return data; } } ``` --- ## 四、加密存储 ```java /** * 数据库字段加密 */ @Component public class FieldEncryptUtil { @Autowired private AesEncryptor aesEncryptor; /** * 加密 */ public String encrypt(String plaintext) { return aesEncryptor.encrypt(plaintext); } /** * 解密 */ public String decrypt(String ciphertext) { return aesEncryptor.decrypt(ciphertext); } } /** * MyBatis加密拦截器 */ @Intercepts({ @Signature(type = Executor.class, method = "update"), @Signature(type = Executor.class, method = "query") }) @Component public class FieldEncryptInterceptor implements Interceptor { @Autowired private FieldEncryptUtil encryptUtil; @Override public Object intercept(Invocation invocation) throws Throwable { // 写入时加密 if ("update".equals(invocation.getMethod().getName())) { encryptParams(invocation.getArgs()); } Object result = invocation.proceed(); // 查询时解密 if ("query".equals(invocation.getMethod().getName())) { decryptResult(result); } return result; } } ``` --- ## 五、踩坑实录 ### 坑1:脱敏了但数据库里没加密 > API返回脱敏了,但数据库里是明文存储,被SQL注入后泄露。 **解决**:敏感字段数据库加密存储。 ### 坑2:脱敏规则不统一 > 不同服务的脱敏方式不同,A服务手机号3位+4位,B服务4位+4位。 **解决**:统一脱敏工具类,强制使用。 ### 坑3:日志脱敏遗漏 > 有些日志是第三方库打印的,没有经过我们的脱敏过滤器。 **解决**:Logback脱敏插件,统一处理所有日志输出。 ### 坑4:加密后无法查询 > 手机号加密存储后,无法按手机号查询。 **解决**:存储脱敏值+加密值,用脱敏值查询;或使用可搜索加密。 ### 坑5:密钥管理 > 加密密钥硬编码在代码里,不安全。 **解决**:密钥存储在KMS(密钥管理服务),运行时动态获取。 --- ## 六、总结 数据隐私保护要点: | 层面 | 方案 | |------|------| | 传输 | HTTPS + 字段加密 | | 存储 | 数据库字段加密 | | 展示 | 脱敏返回 | | 日志 | 自动脱敏 | | 密钥 | KMS管理 | **血的教训:** > 数据安全不是可选项。一次数据泄露的代价,远超安全建设的成本。 **思考题:** 你的系统做了哪些数据脱敏措施? --- *个人观点,仅供参考*

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册