首页 文章 精选 留言 我的

精选列表

搜索[合规基座],共8893篇文章
优秀的个人博客,低调大师

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

## 一、日志里打印了用户手机号,被安全部门约谈 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管理 | **血的教训:** > 数据安全不是可选项。一次数据泄露的代价,远超安全建设的成本。 **思考题:** 你的系统做了哪些数据脱敏措施? --- *个人观点,仅供参考*

优秀的个人博客,低调大师

大模型备案合规核心:拦截关键词库应用指南

2026 年,大模型备案不再是"备了就过"的流程性动作。"清朗·整治 AI 应用乱象"专项行动把"未按规定履行备案登记义务"和"AI 平台安全与审核过滤能力不足"列为第一阶段整治重点,安全审核能力是否真实、可量化,成为备案能不能一次通过的关键。而在整套备案材料里,拦截关键词库(即备案材料中的"风险拦截关键词列表")正是审核过滤能力最直接的证明文件——它同时也是被退回、被补正次数最多的材料之一。

优秀的个人博客,低调大师

Java集成公安二要素政务版实现精准合规审查

在推进数字政务与“一网通办”服务的进程中,确保办事群众身份的真实有效是防范各类虚假申报与履约隐患的基础。传统政务服务窗口或早期的线上审批模式,通常要求申请人上传手持身份证照片或进行线下材料比对。这一过程不仅耗时费力、用户体验不佳,且在面对非真实日常账号或伪造资质时,依靠人工肉眼的辨识度很难做到实时、精确的前置准入校验。

优秀的个人博客,低调大师

加州法院裁定使用版权内容训练 AI 合规

美国加州北区地方法院裁定,Anthropic 公司在未经作者许可的情况下,使用已出版的书籍训练其 AI 模型是合法的。这标志着法院首次认可 AI 公司的说法,即合理使用原则可以免除 AI 公司在使用受版权保护的材料训练大语言模型(LLM)时的过错。 根据科技媒体 AppleInsider 的报道,许多创作者和艺术家长期以来都在为人工智能公司未经许可抓取其作品而苦恼。这些公司利用抓取的数据来训练大型语言模型(LLM),并将其商业化,然而内容的原创者却未能得到应有的补偿。对此,Andrea Bartz、Charles Graeber 和 Kirk Wallace Johnson 于2024年向法院提起诉讼,指控 Anthropic 公司侵犯其版权,使用了盗版材料。 法官 William Alsup 在裁决中支持了双方的部分请求,但最终认为用于训练特定大语言模型的副本属于合理使用。这一裁定意味着 AI 公司在训练其模型时可以合法使用受版权保护的内容,而这也让众多艺术家、音乐家和作家感到失望。 对于这些创作者来说,这项决定可能会使他们面临更大的商业风险,AI 模型的生成能力有可能进一步侵蚀他们的作品价值。 Alsup 法官在判决书中明确表示:"我们将就Anthropic公司用于创建中央图书馆的盗版书籍及其造成的损失进行审理。Anthropic公司后来购买了之前从网上盗取的书籍,这并不能免除其盗窃责任,但这可能会影响法定赔偿的数额。"

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

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

用户登录
用户注册