为了账号安全,请及时绑定邮箱和手机立即绑定

SpringBoot+Tika实现数据泄露防护、检测敏感信息功能全流程代码讲解

标签:
Java SpringBoot

本文主要介绍了如何使用 Spring Boot 和 Apache Tika 实现数据泄露防护和敏感信息检测功能。


🚨【阿里云限时特惠】云产品低至38元/年起!🎉

各位技术伙伴,阿里云爆款钜惠来袭!立即抢购:阿里云特惠 💰


🔥 新人专享特惠

  • 200M带宽云服务器
    38元/年起(官网价¥459元/年),立省421元!
    ✔️ 适用场景:网站搭建/Web应用/电商独立站

  • 经济型e实例
    续费99元/年 | 2核2G + 3M带宽 + 40G ESSD云盘
    ✔️ 含防病毒版安全防护(防勒索/挖矿/木马)
    ✔️ 限新用户,每人限购1台


🤖 AI大模型特惠

  • DeepSeek R1大模型
    首年99元起 | 1.5B/7B参数规格
    ✔️ 支持宝塔面板一键部署
    ✔️ 数学/代码/推理任务表现出色

  • 企业知识库应用
    数据库+文件存储+多端支持
    ✔️ 低代码扩展 + 钉钉/企微/微信集成

Tika介绍

Apache Tika 是一个功能强大的内容分析工具,具有以下特点:

  1. 支持多种文件格式,包括办公文档、PDF、HTML、XML、文本文件、图片、音视频、电子邮件和压缩文件等。
  2. 能自动检测文件类型,根据文件内容而非扩展名判断文件的真实类型,并识别 MIME 类型。
  3. 能提取文本和元数据,如作者、创建日期、修改日期、文件大小、版权信息等。
  4. 支持 OCR,可从扫描图像或 PDF 文档中的图片提取文本信息。
  5. 具备自动检测文件文本语言的功能。
  6. 可嵌入到其他 Java 应用中,提供 Java API,也可作为独立应用使用,如命令行工具 Tika App 和基于 RESTful API 的 Tika Server。
  7. 支持多线程处理,可提高大批量文件处理速度。
  8. 返回统一的 JSON 或 XML 格式输出,便于与其他系统集成。
  9. 支持处理大型文档和多页文档。
  10. 可与其他工具和库集成,如 Lucene、Solr、Elasticsearch、Apache POI、PDFBox 和 Tesseract OCR 等。
  11. 具有高度可扩展性,用户可根据需求自定义解析器、增加新文件格式支持或调整文本提取策略。

Tika 的架构组件,包括 Tika Core、Tika Parsers、Tika Config、Tika App、Tika Server、Tika Language Detection、Tika Extractor、Tika Metadata 和 Tika OCR 等。

在应用场景方面,Tika 可广泛应用于企业文档管理系统、内容管理系统(CMS)、数据分析与大数据平台、法律与合规性审查、数字资产管理(DAM)、信息安全与数据泄露防护以及自动化电子邮件分类等领域。

文章重点讲解了如何在 Spring Boot 中集成 Apache Tika 用于敏感信息识别和数据泄露防护。通过在文件上传时提取文件内容,并在提取的文本中搜索潜在的敏感数据(如身份证号、信用卡信息、电话号码等),实现敏感信息检测和数据泄露防护。

完整代码

包含 Maven 依赖、配置文件、Controller 接口、Service 和测试用例等,每一行代码都添加了注释,确保完整且可直接使用。

Maven 依赖

pom.xml 文件中添加以下依赖:

<dependencies>
    <!-- Spring Boot Web 依赖,用于创建 RESTful API -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Apache Tika Core 依赖,提供核心的文件解析和内容提取功能 -->
    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-core</artifactId>
        <version>2.6.0</version>
    </dependency>

    <!-- Apache Tika Parsers 依赖,提供各种文件格式的解析器 -->
    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-parsers</artifactId>
        <version>2.6.0</version>
    </dependency>
</dependencies>

配置文件

创建 application.properties 配置文件(位于 src/main/resources 目录):

# 配置服务器端口
server.port=8080

# 配置文件上传限制(例如:最大文件大小为 10MB)
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

Service 层代码

创建 SensitiveInfoService.java 文件(位于 src/main/java/com/example/tikademo/service 目录):

package com.example.tikademo.service;

import org.apache.tika.Tika;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.sax.BodyContentHandler;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Service
public class SensitiveInfoService {

    // 创建 Tika 实例,用于文件内容解析
    private final Tika tika = new Tika();

    // 定义正则表达式模式,用于检测身份证号、信用卡号和电话号码
    private static final String ID_CARD_REGEX = "(\\d{17}[\\dXx]|\\d{15})"; // 身份证号正则表达式
    private static final String CREDIT_CARD_REGEX = "(\\d{4}-?\\d{4}-?\\d{4}-?\\d{4})"; // 信用卡号正则表达式
    private static final String PHONE_REGEX = "(\\d{3}-?\\d{3}-?\\d{4})|((\\d{11})|(\\d{3})\\d{7})"; // 电话号码正则表达式

    /**
     * 提取文件内容并检测敏感信息
     *
     * @param fileInputStream 文件输入流
     * @return 检测结果字符串,包含检测到的敏感信息或提示未检测到敏感信息
     * @throws IOException 如果读取文件内容时发生 I/O 错误
     */
    public String checkSensitiveInfo(InputStream fileInputStream) throws IOException {
        // 使用 Tika 提取文件内容
        String fileContent = tika.parseToString(fileInputStream);

        // 初始化 StringBuilder,用于构建检测结果
        StringBuilder sensitiveInfoDetected = new StringBuilder();

        // 检测身份证号
        detectAndAppend(fileContent, ID_CARD_REGEX, "身份证号", sensitiveInfoDetected);

        // 检测信用卡号
        detectAndAppend(fileContent, CREDIT_CARD_REGEX, "信用卡号", sensitiveInfoDetected);

        // 检测电话号码
        detectAndAppend(fileContent, PHONE_REGEX, "电话号码", sensitiveInfoDetected);

        // 返回检测结果,如果未检测到敏感信息,则返回相应提示
        return sensitiveInfoDetected.length() > 0 ? sensitiveInfoDetected.toString() : "未检测到敏感信息";
    }

    /**
     * 通用的敏感信息检测方法
     *
     * @param content   文件内容
     * @param regex     正则表达式模式
     * @param label     敏感信息标签(如身份证号、信用卡号等)
     * @param result    用于存储检测结果的 StringBuilder
     */
    private void detectAndAppend(String content, String regex, String label, StringBuilder result) {
        // 编译正则表达式模式
        Pattern pattern = Pattern.compile(regex);
        // 创建 Matcher 对象,用于在文件内容中查找匹配项
        Matcher matcher = pattern.matcher(content);
        // 循环查找所有匹配项
        while (matcher.find()) {
            // 将检测到的敏感信息追加到结果中
            result.append(label).append(": ").append(matcher.group()).append("\n");
        }
    }
}

Controller 层代码

创建 FileController.java 文件(位于 src/main/java/com/example/tikademo/controller 目录):

package com.example.tikademo.controller;

import com.example.tikademo.service.SensitiveInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@RestController
@RequestMapping("/api/files")
public class FileController {

    // 注入 SensitiveInfoService 用于敏感信息检测
    @Autowired
    private SensitiveInfoService sensitiveInfoService;

    /**
     * 处理文件上传请求,并检测文件中的敏感信息
     *
     * @param file 上传的文件
     * @return 检测结果字符串
     */
    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            // 获取上传文件的输入流
            String result = sensitiveInfoService.checkSensitiveInfo(file.getInputStream());
            return result;
        } catch (IOException e) {
            // 如果发生 I/O 错误,返回错误信息
            return "文件处理错误: " + e.getMessage();
        }
    }
}

前端页面

创建 index.html 文件(位于 src/main/resources/static 目录):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Upload File for Sensitive Information Detection</title>
</head>
<body>
    <h2>Upload a File for Sensitive Information Detection</h2>
    <!-- 创建文件上传表单,提交到 /api/files/upload 地址 -->
    <form action="/api/files/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file" required> <!-- 文件选择输入框 -->
        <button type="submit">Upload</button> <!-- 上传按钮 -->
    </form>
</body>
</html>

测试用例

创建测试文档 test.txt(内容如下),用于测试敏感信息检测功能:

复制

尊敬的用户:

您好!感谢您使用我们的服务。以下是您的账户信息:

身份证号:123456789012345678
信用卡号:1234-5678-9876-5432
电话号码:138-1234-5678

如果您对我们的服务有任何问题,请随时联系客户支持团队。

谢谢!

此致,
敬礼!

测试步骤

  1. 创建一个 Spring Boot 项目,并按照上述代码配置项目结构和文件。
  2. 将上述代码分别放入对应的文件中。
  3. 启动 Spring Boot 应用。
  4. 访问 http://localhost:8080 页面,上传包含敏感信息的 test.txt 文件。
  5. 查看检测结果,应显示检测到的身份证号、信用卡号和电话号码等敏感信息。

上述代码完整且可直接使用,每一行代码都添加了详细的注释,方便理解和使用。

本文由博客一文多发平台 OpenWrite 发布!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消