Golang中实现数据脱敏处理的go-mask包分享

 更新时间:2023年05月23日 16:46:43   作者:Go学堂  
这篇文章主要是来和大家分享一个在输出中对敏感数据进行脱敏的工作包:go-mask,可以将敏感信息输出的时候替换成星号或其他字符,感兴趣的小编可以跟随小编一起了解下

今天给大家推荐一款在输出中对敏感数据进行脱敏的工作包:go-mask。

那么,什么是对敏感数据脱敏呢?就是将敏感信息输出的时候替换成星号或其他字符。比如手机号码,身份证信息,姓名等。

go-mask包还是比较新的,是在两周前提交的。所以星标只有71个。星标虽少,但功能还是很强大的。我们看看go-mask都有哪些功能。

特征

  • 通过结构体的tag功能可以脱敏结构体中的任何字段
  • 除了使用go-mask的内置的脱敏函数外,用户还可以自定义脱敏函数。

支持的tags标签

go-mask只提供了有限的几个tags。原因是用户可以根据需要自定义脱敏函数。以下是go-mask支持的tags:

tagtype描述
mask:"filled"string输出和原字符串相同个数的脱敏字符。例如:原字符串是4个字符,那么就输出4个星号:****
mask:"filledXXX"stringXXX是脱敏字符的个数。即输出XXX个脱敏字符。例如:mask:"filled3"代表最终输出"***"
mask:"fixed"string输出固定个数的脱敏字符,默认是8个字符。例如:********
mask:"hash"string对原字符串使用sha1哈希输出
mask:"randomXXX"int / float64XXX代表数字值。将原值转换成0-XXX之间的随机值输出
mask:"zero"any输出对应类型的零值

如何使用

对字符串类型脱敏

package main
import (
	"fmt"
	mask "github.com/showa-93/go-mask"
)
func main() {
	maskValue, _ := mask.String(mask.MaskTypeFixed, "Hello World!!")
	fmt.Println(maskValue) //输出固定的8个脱敏字符: ********
}

对结构体中的string类型字段进行脱敏处理。如下:

package main
import (
	"fmt"
	mask "github.com/showa-93/go-mask"
)
func main() {
	value := struct {
		Title string   `mask:"filled"`
		Casts []string `mask:"fixed"`
	}{
		Title: "Catch Me If You Can",
		Casts: []string{
			"Thomas Jeffrey \"Tom\" Hanks",
			"Leonardo Wilhelm DiCaprio",
		},
	}
    maskValue, _ := mask.Mask(value)
	fmt.Printf("value:%+v\n", value)
	fmt.Printf("maskValue:%+v\n", maskValue) //脱敏字符输出符号是:*
    masker := mask.NewMasker()
	masker.SetMaskChar("-") //自定义脱敏字符为 - 
    // 给对应的tag注册对应的脱敏处理函数
	masker.RegisterMaskStringFunc(mask.MaskTypeFilled, masker.MaskFilledString)
	masker.RegisterMaskStringFunc(mask.MaskTypeFixed, masker.MaskFixedString)
	maskValue2, _ := masker.Mask(value)
	fmt.Printf("maskValue2:%+v\n", maskValue2)
}

输出结果如下:

value:{Title:Catch Me If You Can Casts:[Thomas Jeffrey "Tom" Hanks Leonardo Wilhelm DiCaprio]}
maskValue:{Title:******************* Casts:[******** ********]}
maskValue2:{Title:------------------- Casts:[-------- --------]}

对int/float64类型字段脱敏

对int/float64类型的字段一般使用mask:"randomXXX"的标签,表示转换成从0到XXX的随机数。如下:

package main
import (
	"fmt"
	mask "github.com/showa-93/go-mask"
)
func main() {
	{
		maskValue, _ := mask.Int("random100", 10)
		fmt.Println(maskValue)
	}
	{
		maskValue, _ := mask.Float64("random100.2", 12.3)
		fmt.Println(maskValue)
	}
	{
		value := struct {
			Price   int     `mask:"random1000"`
			Percent float64 `mask:"random1.3"`
		}{
			Price:   300,
			Percent: 0.80,
		}
		masker := mask.NewMasker()
		masker.RegisterMaskIntFunc(mask.MaskTypeRandom, masker.MaskRandomInt)
		masker.RegisterMaskFloat64Func(mask.MaskTypeRandom, masker.MaskRandomFloat64)
		maskValue, _ := mask.Mask(value)
		maskValue2, _ := masker.Mask(value)
		fmt.Printf("%+v\n", maskValue)
		fmt.Printf("%+v\n", maskValue2)
	}
}

对应的输出结果如下:

29
50.45
{Price:917 Percent:0.183}
{Price:733 Percent:0.241}

对slice类型脱敏处理

对slice类型的处理本质上还是对基础类型的处理,类似于结构体或对应的string/int/float64类型。如下:

package main
import (
	"fmt"
	"github.com/showa-93/go-mask"
)
type Value struct {
	Name string `mask:"filled"`
	Type int    `mask:"random10"`
}
func main() {
	values := []Value{
		{
			Name: "Thomas Jeffrey \"Tom\" Hanks",
			Type: 1,
		},
		{
			Name: "Leonardo Wilhelm DiCaprio",
			Type: 2,
		},
	}
	masker := mask.NewMasker()
	masker.SetMaskChar("+")
	masker.RegisterMaskStringFunc(mask.MaskTypeFilled, masker.MaskFilledString)
	masker.RegisterMaskIntFunc(mask.MaskTypeRandom, masker.MaskRandomInt)
	maskValues, _ := mask.Mask(values)
	maskValues2, _ := masker.Mask(values)
	fmt.Printf("%+v\n", values)
	fmt.Printf("%+v\n", maskValues)
	fmt.Printf("%+v\n", maskValues2)
}

输出如下:

[{Name:Thomas Jeffrey "Tom" Hanks Type:1} {Name:Leonardo Wilhelm DiCaprio Type:2}]
[{Name:************************** Type:8} {Name:************************* Type:9}]
[{Name:++++++++++++++++++++++++++ Type:4} {Name:+++++++++++++++++++++++++ Type:8}]

对map类型进行处理

对map类型的处理,是处理的map中的value,对key不做处理。如下:

package main
import (
	"fmt"
	"github.com/showa-93/go-mask"
)
type Value struct {
	Name string `mask:"filled"`
	Type int    `mask:"random10"`
}
func main() {
	values := map[string]Value{
		"one": {
			Name: "Thomas Jeffrey \"Tom\" Hanks",
			Type: 1,
		},
		"two": {
			Name: "Leonardo Wilhelm DiCaprio",
			Type: 2,
		},
	}
	masker := mask.NewMasker()
	masker.SetMaskChar("")
	masker.RegisterMaskStringFunc(mask.MaskTypeFilled, masker.MaskFilledString)
	masker.RegisterMaskIntFunc(mask.MaskTypeRandom, masker.MaskRandomInt)
	maskValues, _ := mask.Mask(values)
	maskValues2, _ := masker.Mask(values)
	fmt.Printf("%+v\n", values)
	fmt.Printf("%+v\n", maskValues)
	fmt.Printf("%+v\n", maskValues2)
}

输出结果如下:

map[one:{Name:Thomas Jeffrey "Tom" Hanks Type:1} two:{Name:Leonardo Wilhelm DiCaprio Type:2}]
map[one:{Name:************************** Type:8} two:{Name:************************* Type:6}]
map[one:{Name: Type:6} two:{Name: Type:2}]

自定义脱敏函数

go-mask包还支持自定义的脱敏函数的处理。将定义好的函数通过mask.RegisterMaskStringFunc函数进行注册即可。如下,定义了regexp标签和MaskRegExp脱敏处理函数:

package main
import (
	"fmt"
	"regexp"
	"strings"
	mask "github.com/showa-93/go-mask"
)
func init() {
	maskTypeRegExp := "regexp"
	mask.RegisterMaskStringFunc(maskTypeRegExp, MaskRegExp)
}
// MaskRegExp is sample to add a custom mask function
func MaskRegExp(arg, value string) (string, error) {
	var (
		reg *regexp.Regexp
		err error
	)
	reg, err = regexp.Compile(arg)
	if err != nil {
		return "", err
	}
	indexes := reg.FindStringSubmatchIndex(value)
	if len(indexes) >= 4 && indexes[2] >= 0 && indexes[3] >= 0 {
		var sb strings.Builder
		sb.WriteString(value[:indexes[2]])
		sb.WriteString(mask.MaskChar())
		sb.WriteString(value[indexes[3]:])
		return sb.String(), nil
	}
	return value, nil
}
func main() {
	mask.SetMaskChar("cat")
	type Hachiware struct {
		Message string `mask:"regexp(gopher)."`
	}
	input := Hachiware{Message: "I love gopher!"}
	got, _ := mask.Mask(input)
	fmt.Printf("%+v\n", input)
	fmt.Printf("%+v\n", got)
	// The Masker initialized with NewMasker does not have
	// any custom masking functions registered, so no masking will occur
	masker := mask.NewMasker()
	got2, _ := masker.Mask(input)
	fmt.Printf("%+v\n", got2)
}

输出结果:

{Message:I love gopher!}
{Message:I love cat!}
{Message:I love gopher!}

好了,以上就是go-mask的主要功能。如果你的业务中有需要脱敏输出的需求,推荐使用该包。

该包开源地址:https://github.com/showa-93/go-mask

到此这篇关于Golang中实现数据脱敏处理的go-mask包分享的文章就介绍到这了,更多相关Golang数据脱敏处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go依赖注入工具wire的具体使用

    Go依赖注入工具wire的具体使用

    本文主要介绍了Go依赖注入工具wire的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Golang限流库与漏桶和令牌桶的使用介绍

    Golang限流库与漏桶和令牌桶的使用介绍

    这篇文章主要介绍了golang限流库以及漏桶与令牌桶的实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • 使用Go添加HTTPS的实现代码示例

    使用Go添加HTTPS的实现代码示例

    这篇文章主要介绍了使用Go添加HTTPS的实现代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • go语言实现mqtt协议的实践

    go语言实现mqtt协议的实践

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。本文主要介绍了go语言实现mqtt协议的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Go语言中Struct与继承与匿名字段和内嵌结构体全面详解

    Go语言中Struct与继承与匿名字段和内嵌结构体全面详解

    这篇文章主要介绍了Go语言中Struct与继承与匿名字段和内嵌结构体,Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性,感兴趣的可以了解一下
    2023-04-04
  • golang gorm 操作mysql及gorm基本用法

    golang gorm 操作mysql及gorm基本用法

    golang 官方的那个操作mysql的有点麻烦所以就使用了gorm,下面就gorm的使用做下简单介绍,感兴趣的朋友跟随小编一起看看吧
    2018-11-11
  • 一文详解Golang的模块版本管理与语义版本控制

    一文详解Golang的模块版本管理与语义版本控制

    在Golang中,模块(module)是Go 1.11版本引入的依赖管理系统,帮助开发者管理项目的依赖,在Go模块推出之前,开发者通常使用GOPATH和vendor目录来管理项目的依赖,本文将给大家详细介绍Golang的模块版本管理与语义版本控制,需要的朋友可以参考下
    2023-12-12
  • Go泛型应用工厂方法及泛型使用

    Go泛型应用工厂方法及泛型使用

    这篇文章主要介绍了Go泛型应用工厂方法及泛型使用,结合工厂方法+泛型方法来看一下泛型到底是如何在业务场景中使用的,需要的小伙伴可以参考一下
    2022-07-07
  • golang内置函数len的小技巧

    golang内置函数len的小技巧

    len是很常用的内置函数,可以测量字符串、slice、array、channel以及map的长度/元素个数。本文就来介绍一下其他小技巧,感兴趣的可以了解一下
    2021-07-07
  • golang中tar压缩和解压文件详情

    golang中tar压缩和解压文件详情

    这篇文章主要给大家介绍golang中tar压缩和解压文件,文章以查看官方文档自带的给大家演习一下golang的archive/tar压缩和解压功能,需要的朋友可以参考一下
    2021-11-11

最新评论