贴上依托答辩一样的代码,用于解决“敏感信息泄露识别”

发布时间 2023-04-03 15:53:57作者: it'sxiaohei

假定有两组数据,分别为"内部数据"、"泄露数据",数据的格式和类型不统一,包含的内容有手机号、银行卡号、地址、身份证等敏感信息。

现在需要确认"泄露数据"中的每一条信息的真实性,也就是检查"泄露数据"是否存在于"内部数据"中。

以下的go的实现,速度还是很快的,在"泄露数据"提取出需要检查的信息,再检索"内部数据"。

package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"regexp"
	"strings"
	"sync"
)

const (
	MaxWorkers = 12 // 协程池中的最大协程数
)

// 获取需要的字符
func fetchPhone(filePath string) [][]string {
	// 读取文件
	content, err := ioutil.ReadFile(filePath)
	if err != nil {
		fmt.Printf("failed to read file %s: %s\n", filePath, err)
	}

	phoneRegexp := regexp.MustCompile(`((\+86)|(86)|\(\+86\))(\s)?((\d){11})`)
	phoneList := phoneRegexp.FindAllStringSubmatch(string(content), -1)

	return phoneList
}

func main() {
	for _, v := range fetchPhone("内部数据/txt_files/0a088023-521d-48ac-8c64-47857a369a6f.txt") {
		// 检索泄露数据是否存在于内部文件中
		search(v, "内部数据", "0a088023-521d-48ac-8c64-47857a369a6f.txt", "phone")
	}
}

// sfile,stype 分别为数据来源文件和数据类型,便于输出结果
func search(str []string, dir string, sfile string, stype string) {
	filePaths := make(chan string) // 存放要检索的文件路径的通道

	// 创建协程池
	var wg sync.WaitGroup
	wg.Add(MaxWorkers)
	for i := 0; i < MaxWorkers; i++ {
		go func() {
			defer wg.Done()

			for filePath := range filePaths {
				content, err := ioutil.ReadFile(filePath)
				if err != nil {
					fmt.Printf("failed to read file %s: %s\n", filePath, err)
					continue
				}

				if strings.Contains(string(content), str[5]) {
					// fmt.Printf("%s contains \"%s\"\n", filePath, str)
					// 按照 "泄露文件名 内部文件名 类型 数据内容" 进行输出
					_, filename := filepath.Split(filePath)
					fmt.Printf("%s %s %s %s\n", filename, sfile, stype, str[0])
				}
			}
		}()
	}

	// 遍历目录并将文件路径放入通道中
	err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		// 如果是目录,则跳过
		if info.IsDir() {
			return nil
		}

		filePaths <- path
		return nil
	})

	if err != nil {
		fmt.Println(err)
	}

	close(filePaths)
	wg.Wait()

}