2026/4/16 22:18:14
网站建设
项目流程
好看的响应式网站,wordpress 4.8.5,论坛开源网站源码,网站怎样做3011. 何为后端数据脱敏#xff1f;
在实际业务系统中#xff0c;接口往往会返回包含敏感信息的数据。如果这些数据直接明文返回给前端或第三方系统#xff0c;存在一定的安全与合规风险。
数据脱敏#xff08;Data Masking#xff09;#xff0c;指的是#xff1a;在不修…1. 何为后端数据脱敏在实际业务系统中接口往往会返回包含敏感信息的数据。如果这些数据直接明文返回给前端或第三方系统存在一定的安全与合规风险。数据脱敏Data Masking指的是在不修改原始数据的前提下对返回给客户端的数据进行遮挡或模糊处理以防止敏感信息被完整展示。真实的业务场景中数据脱敏后的展示效果图如下。其中红色框框住的就是脱敏后的信息。常见的需要脱敏的字段手机号、身份证号、邮箱、姓名如支付宝、银行卡号、薪资信息等。是否脱敏取决于接口使用场景、用户角色、数据敏感级别、系统需求需要。脱敏的核心目标是数据可用、数据真实、你有权限查看、但不可全看。2. 脱敏 ≠ 加密 ≠ 删除这是很多初学者容易混淆的地方你需要记住的是脱敏只发生在数据返回阶段数据库中仍然保存完整数据二者互不干扰。我们用一个表格来展示脱敏/加密/删除的区别对比项脱敏加密删除是否可还原否是否是否修改原数据否是是主要用途展示安全存储/传输安全数据清理3. 为什么要在后端做脱敏有些项目会尝试在前端做脱敏处理但这并不安全原因包括接口返回的数据本身仍是明文抓包、日志、调试工具都能看到完整数据权限控制难以统一正确做法脱敏逻辑必须在后端完成。4.后端脱敏实现方式1️⃣ VO 层手动脱敏简单场景适合字段少、接口简单的项目。比如针对手机号的脱敏代码实现public String maskPhone(String phone) { if (phone null || phone.length() 7) { return phone; } return phone.substring(0, 3) **** phone.substring(7); }优点实现简单、通俗易懂缺点重复代码多、不利于统一规范2️⃣ Jackson 自定义序列化推荐我们可以通过 Jackson 的 JsonSerialize在序列化阶段统一脱敏。比如同样是针对手机号进行的脱敏代码编写public class PhoneMaskSerializer extends JsonSerializerString { Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value null) { gen.writeNull(); return; } gen.writeString(value.replaceAll((\\d{3})\\d{4}(\\d{4}), $1****$2)); } }之后我们在字段使用JsonSerialize(using PhoneMaskSerializer.class) private String phone;优点与业务逻辑无关、前端无感知。3️⃣ 注解 AOP企业级推荐方案适合字段多、接口多的中大型项目。首先我们需要定义脱敏注解Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface Desensitize { DesensitizeType type(); }其中待脱敏字段有public enum DesensitizeType { PHONE, EMAIL, ID_CARD }AOP 统一处理返回结果Aspect Component public class DesensitizeAspect { Around(execution(* com.xxx.controller..*(..))) public Object around(ProceedingJoinPoint joinPoint) throws Throwable { Object result joinPoint.proceed(); handle(result); return result; } private void handle(Object obj) throws IllegalAccessException { if (obj null) return; if (obj instanceof Collection? list) { for (Object item : list) { handle(item); } return; } for (Field field : obj.getClass().getDeclaredFields()) { if (!field.isAnnotationPresent(Desensitize.class)) { continue; } field.setAccessible(true); Object value field.get(obj); if (value instanceof String str) { DesensitizeType type field.getAnnotation(Desensitize.class).type(); field.set(obj, mask(str, type)); } } } }手机号码字段使用示例Desensitize(type DesensitizeType.PHONE) private String phone;5. 脱敏设计中的注意事项不要在 Entity 层脱敏Entity 是原始数据模型不应被污染。不要修改数据库中的值脱敏只用于展示。注意 List / Page / Tree 结构的递归处理权限高的用户可以不脱敏可与权限系统结合控制。总结一下数据脱敏是后端数据安全设计的基础能力它≠ 加密二者职责不同。推荐使用 注解 AOP 实现统一、可维护的脱敏方案并将脱敏逻辑放在接口返回阶段。你学废了吗