适用场景在业务系统开发与运维过程中日志记录、错误提示、数据库备份等环节极易泄露用户敏感信息。常规做法是在输出前手动调用脱敏函数但面对多种敏感类型手机号、身份证、银行卡、邮箱、姓名时重复编写正则不仅低效且容易遗漏新类型或格式变种。数据脱敏API提供了开箱即用的敏感信息检测与掩码能力可集成到日志框架、网关过滤、数据清洗管道或前端展示层无需自行维护正则规则。典型场景包括日志脱敏在Logback或Log4j2的Appender中调用确保日志文件不包含明文敏感字段。接口返回值脱敏在REST API响应序列化前对敏感字段进行掩码防止信息泄漏给非授权客户端。数据导出脱敏批量查询数据库后对结果集中的敏感列统一脱敏再导出到CSV或报表。测试数据生成对生产环境导出数据进行脱敏后供测试环境使用。接口能力边界检测类型支持手机号国内11位、身份证15/18位、银行卡16-19位、邮箱、中文姓名2-4字常见姓名。所有匹配基于纯本地正则无需联网毫秒级返回。请求限制单次text最长50000字节约5万字符QPS限制10/s。如文本过长需业务侧分片。掩码规则默认不保留原文仅返回掩码后的文本及检测位置。可通过with_original参数在detections中附带原始值仅供调试生产建议关闭。类型组合支持逗号分隔指定需脱敏的类型如phone,email或使用all覆盖全部类型。请求参数与鉴权鉴权方式通过HTTP HeaderX-API-Key传递API密钥从平台获取。示例如下X-API-Key: your-api-key请求体字段字段类型必填说明textstring是待脱敏的原始文本最长50000字节。typesstring否需要脱敏的类型逗号分隔默认all。可选值phone、idcard、bankcard、email、name。with_originalboolean否是否在detections中回显原始敏感值默认false。注意text字段应传入字符串若传入非字符串类型如数字API会返回参数校验错误。快速接入curl 示例以下示例演示对一个包含姓名和手机号的文本进行脱敏仅对姓名和手机号进行掩码设置typesname,phone。curl -sS -X POST \ -H X-API-Key: ${APIZERO_API_KEY} \ -H Content-Type: application/json \ -d { text: 联系人张三电话 13812345678, types: name,phone, with_original: false } \ https://v1.apizero.cn/api/desensitize执行后预期返回{ code: 0, data: { detection_count: 2, detections: [ {masked: 张*, type: name}, {masked: 138****8000, type: phone} ], masked_text: 联系人张*电话 138****8000, summary: {name: 1, phone: 1}, types_applied: [name, phone] }, msg: 成功 }Java 代码接入Spring Boot 示例以下是用RestTemplate发送POST请求的典型实现。注意需要将API密钥配置在application.yml中。1. 添加依赖Mavendependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency2. 配置类Component public class DesensitizeClient { private static final String API_URL https://v1.apizero.cn/api/desensitize; private final RestTemplate restTemplate; private final String apiKey; public DesensitizeClient(Value(${apizero.api-key}) String apiKey) { this.restTemplate new RestTemplate(); this.apiKey apiKey; } public DesensitizeResponse desensitize(String text, String types, boolean withOriginal) { HttpHeaders headers new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set(X-API-Key, apiKey); MapString, Object body new HashMap(); body.put(text, text); body.put(types, types); body.put(with_original, withOriginal); HttpEntityMapString, Object request new HttpEntity(body, headers); ResponseEntityDesensitizeResponse response restTemplate.postForEntity(API_URL, request, DesensitizeResponse.class); return response.getBody(); } }3. 响应DTOpublic class DesensitizeResponse { private int code; private Data data; private String msg; // getters setters public static class Data { private int detection_count; private ListDetection detections; private String masked_text; private MapString, Integer summary; private ListString types_applied; // getters setters } public static class Detection { private String masked; private String type; // 当 with_originaltrue 时包含 original 字段 private String original; // getters setters } }4. 调用示例RestController public class DemoController { Autowired private DesensitizeClient client; PostMapping(/logs) public String processLog(RequestBody String rawLog) { DesensitizeResponse resp client.desensitize(rawLog, all, false); if (resp.getCode() 0) { return resp.getData().getMasked_text(); } else { throw new RuntimeException(脱敏失败: resp.getMsg()); } } }返回值详解字段类型说明codeint0表示成功非0表示错误msgstring状态描述data.masked_textstring脱敏后的完整文本data.detection_countint检测到的敏感信息总数data.detectionsarray每个被检测到的敏感条目包含masked掩码后值和type类型data.summaryobject按类型统计检测次数例如{phone: 2, name: 1}data.types_appliedarray本次实际启用的脱敏类型列表由服务端根据传入types解析后确定data.detections[].originalstring仅当with_originaltrue时存在为原始值。生产环境建议关闭。常见错误码与排查错误码含义排查方向-1系统内部错误检查请求格式联系技术支持。1001缺少X-API-Key头确认请求头携带正确且API密钥未过期。1002API Key 无效检查密钥是否正确或是否被封禁。2001请求体解析失败确认Content-Type为application/json且JSON语法正确。2002text长度超过50000字节对长文本分片后分别请求。2003types参数包含非法值types仅支持phone,idcard,bankcard,email,name,all。2004text为空或非字符串确认传入JSON中text字段为有效非空字符串。工程化注意事项QPS 控制接口限制10/s建议在客户端加入限流或重试机制如Resilience4j。若单次任务需要处理大量文本分批发送并控制并发数。超时设置考虑到文本长度和网络延迟HTTP连接超时建议设置10秒读取超时30秒。数据完整性masked_text返回脱敏后文本但detections仅报告匹配到的片段。如果某段敏感信息被斜杠或空格分割如“138 1234 5678”可能无法被正则捕获。建议在调用前对文本做规范化处理如移除空格。日志集成在Logback的MessageConverter或Encoder中调用此API时需注意不要产生循环依赖脱敏APIs日志本身也需要脱敏。推荐在应用层统一封装日志工具类而非在日志框架底层直接调用。性能测试虽然毫秒级返回但在高并发日志场景下每次I/O开销不可忽视。可考虑本地缓存脱敏规则或使用批量接口当前无批量接口需自行聚合。中文姓名脱敏姓名检测依赖常见姓氏1-2字名对于复姓如“欧阳”或少数民族长名可能识别为多个片段。需在业务层补充样本测试。数据留存with_original打开后原始值会随响应返回请确保不在服务器日志中打印原始响应体避免二次泄漏。参考文档数据脱敏 API 文档原始文档Markdown提示文档中包含完整的参数说明与更多示例接入前建议仔细阅读。
数据脱敏API实战:敏感信息掩码在业务日志中的工程化应用
发布时间:2026/7/11 13:35:46
适用场景在业务系统开发与运维过程中日志记录、错误提示、数据库备份等环节极易泄露用户敏感信息。常规做法是在输出前手动调用脱敏函数但面对多种敏感类型手机号、身份证、银行卡、邮箱、姓名时重复编写正则不仅低效且容易遗漏新类型或格式变种。数据脱敏API提供了开箱即用的敏感信息检测与掩码能力可集成到日志框架、网关过滤、数据清洗管道或前端展示层无需自行维护正则规则。典型场景包括日志脱敏在Logback或Log4j2的Appender中调用确保日志文件不包含明文敏感字段。接口返回值脱敏在REST API响应序列化前对敏感字段进行掩码防止信息泄漏给非授权客户端。数据导出脱敏批量查询数据库后对结果集中的敏感列统一脱敏再导出到CSV或报表。测试数据生成对生产环境导出数据进行脱敏后供测试环境使用。接口能力边界检测类型支持手机号国内11位、身份证15/18位、银行卡16-19位、邮箱、中文姓名2-4字常见姓名。所有匹配基于纯本地正则无需联网毫秒级返回。请求限制单次text最长50000字节约5万字符QPS限制10/s。如文本过长需业务侧分片。掩码规则默认不保留原文仅返回掩码后的文本及检测位置。可通过with_original参数在detections中附带原始值仅供调试生产建议关闭。类型组合支持逗号分隔指定需脱敏的类型如phone,email或使用all覆盖全部类型。请求参数与鉴权鉴权方式通过HTTP HeaderX-API-Key传递API密钥从平台获取。示例如下X-API-Key: your-api-key请求体字段字段类型必填说明textstring是待脱敏的原始文本最长50000字节。typesstring否需要脱敏的类型逗号分隔默认all。可选值phone、idcard、bankcard、email、name。with_originalboolean否是否在detections中回显原始敏感值默认false。注意text字段应传入字符串若传入非字符串类型如数字API会返回参数校验错误。快速接入curl 示例以下示例演示对一个包含姓名和手机号的文本进行脱敏仅对姓名和手机号进行掩码设置typesname,phone。curl -sS -X POST \ -H X-API-Key: ${APIZERO_API_KEY} \ -H Content-Type: application/json \ -d { text: 联系人张三电话 13812345678, types: name,phone, with_original: false } \ https://v1.apizero.cn/api/desensitize执行后预期返回{ code: 0, data: { detection_count: 2, detections: [ {masked: 张*, type: name}, {masked: 138****8000, type: phone} ], masked_text: 联系人张*电话 138****8000, summary: {name: 1, phone: 1}, types_applied: [name, phone] }, msg: 成功 }Java 代码接入Spring Boot 示例以下是用RestTemplate发送POST请求的典型实现。注意需要将API密钥配置在application.yml中。1. 添加依赖Mavendependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency2. 配置类Component public class DesensitizeClient { private static final String API_URL https://v1.apizero.cn/api/desensitize; private final RestTemplate restTemplate; private final String apiKey; public DesensitizeClient(Value(${apizero.api-key}) String apiKey) { this.restTemplate new RestTemplate(); this.apiKey apiKey; } public DesensitizeResponse desensitize(String text, String types, boolean withOriginal) { HttpHeaders headers new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set(X-API-Key, apiKey); MapString, Object body new HashMap(); body.put(text, text); body.put(types, types); body.put(with_original, withOriginal); HttpEntityMapString, Object request new HttpEntity(body, headers); ResponseEntityDesensitizeResponse response restTemplate.postForEntity(API_URL, request, DesensitizeResponse.class); return response.getBody(); } }3. 响应DTOpublic class DesensitizeResponse { private int code; private Data data; private String msg; // getters setters public static class Data { private int detection_count; private ListDetection detections; private String masked_text; private MapString, Integer summary; private ListString types_applied; // getters setters } public static class Detection { private String masked; private String type; // 当 with_originaltrue 时包含 original 字段 private String original; // getters setters } }4. 调用示例RestController public class DemoController { Autowired private DesensitizeClient client; PostMapping(/logs) public String processLog(RequestBody String rawLog) { DesensitizeResponse resp client.desensitize(rawLog, all, false); if (resp.getCode() 0) { return resp.getData().getMasked_text(); } else { throw new RuntimeException(脱敏失败: resp.getMsg()); } } }返回值详解字段类型说明codeint0表示成功非0表示错误msgstring状态描述data.masked_textstring脱敏后的完整文本data.detection_countint检测到的敏感信息总数data.detectionsarray每个被检测到的敏感条目包含masked掩码后值和type类型data.summaryobject按类型统计检测次数例如{phone: 2, name: 1}data.types_appliedarray本次实际启用的脱敏类型列表由服务端根据传入types解析后确定data.detections[].originalstring仅当with_originaltrue时存在为原始值。生产环境建议关闭。常见错误码与排查错误码含义排查方向-1系统内部错误检查请求格式联系技术支持。1001缺少X-API-Key头确认请求头携带正确且API密钥未过期。1002API Key 无效检查密钥是否正确或是否被封禁。2001请求体解析失败确认Content-Type为application/json且JSON语法正确。2002text长度超过50000字节对长文本分片后分别请求。2003types参数包含非法值types仅支持phone,idcard,bankcard,email,name,all。2004text为空或非字符串确认传入JSON中text字段为有效非空字符串。工程化注意事项QPS 控制接口限制10/s建议在客户端加入限流或重试机制如Resilience4j。若单次任务需要处理大量文本分批发送并控制并发数。超时设置考虑到文本长度和网络延迟HTTP连接超时建议设置10秒读取超时30秒。数据完整性masked_text返回脱敏后文本但detections仅报告匹配到的片段。如果某段敏感信息被斜杠或空格分割如“138 1234 5678”可能无法被正则捕获。建议在调用前对文本做规范化处理如移除空格。日志集成在Logback的MessageConverter或Encoder中调用此API时需注意不要产生循环依赖脱敏APIs日志本身也需要脱敏。推荐在应用层统一封装日志工具类而非在日志框架底层直接调用。性能测试虽然毫秒级返回但在高并发日志场景下每次I/O开销不可忽视。可考虑本地缓存脱敏规则或使用批量接口当前无批量接口需自行聚合。中文姓名脱敏姓名检测依赖常见姓氏1-2字名对于复姓如“欧阳”或少数民族长名可能识别为多个片段。需在业务层补充样本测试。数据留存with_original打开后原始值会随响应返回请确保不在服务器日志中打印原始响应体避免二次泄漏。参考文档数据脱敏 API 文档原始文档Markdown提示文档中包含完整的参数说明与更多示例接入前建议仔细阅读。