欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang中實(shí)現(xiàn)數(shù)據(jù)脫敏處理的go-mask包分享

 更新時(shí)間:2023年05月23日 16:46:43   作者:Go學(xué)堂  
這篇文章主要是來和大家分享一個(gè)在輸出中對敏感數(shù)據(jù)進(jìn)行脫敏的工作包:go-mask,可以將敏感信息輸出的時(shí)候替換成星號或其他字符,感興趣的小編可以跟隨小編一起了解下

今天給大家推薦一款在輸出中對敏感數(shù)據(jù)進(jìn)行脫敏的工作包:go-mask。

那么,什么是對敏感數(shù)據(jù)脫敏呢?就是將敏感信息輸出的時(shí)候替換成星號或其他字符。比如手機(jī)號碼,身份證信息,姓名等。

go-mask包還是比較新的,是在兩周前提交的。所以星標(biāo)只有71個(gè)。星標(biāo)雖少,但功能還是很強(qiáng)大的。我們看看go-mask都有哪些功能。

特征

  • 通過結(jié)構(gòu)體的tag功能可以脫敏結(jié)構(gòu)體中的任何字段
  • 除了使用go-mask的內(nèi)置的脫敏函數(shù)外,用戶還可以自定義脫敏函數(shù)。

支持的tags標(biāo)簽

go-mask只提供了有限的幾個(gè)tags。原因是用戶可以根據(jù)需要自定義脫敏函數(shù)。以下是go-mask支持的tags:

tagtype描述
mask:"filled"string輸出和原字符串相同個(gè)數(shù)的脫敏字符。例如:原字符串是4個(gè)字符,那么就輸出4個(gè)星號:****
mask:"filledXXX"stringXXX是脫敏字符的個(gè)數(shù)。即輸出XXX個(gè)脫敏字符。例如:mask:"filled3"代表最終輸出"***"
mask:"fixed"string輸出固定個(gè)數(shù)的脫敏字符,默認(rèn)是8個(gè)字符。例如:********
mask:"hash"string對原字符串使用sha1哈希輸出
mask:"randomXXX"int / float64XXX代表數(shù)字值。將原值轉(zhuǎn)換成0-XXX之間的隨機(jī)值輸出
mask:"zero"any輸出對應(yīng)類型的零值

如何使用

對字符串類型脫敏

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

對結(jié)構(gòu)體中的string類型字段進(jìn)行脫敏處理。如下:

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("-") //自定義脫敏字符為 - 
    // 給對應(yīng)的tag注冊對應(yīng)的脫敏處理函數(shù)
	masker.RegisterMaskStringFunc(mask.MaskTypeFilled, masker.MaskFilledString)
	masker.RegisterMaskStringFunc(mask.MaskTypeFixed, masker.MaskFixedString)
	maskValue2, _ := masker.Mask(value)
	fmt.Printf("maskValue2:%+v\n", maskValue2)
}

輸出結(jié)果如下:

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"的標(biāo)簽,表示轉(zhuǎn)換成從0到XXX的隨機(jī)數(shù)。如下:

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)
	}
}

對應(yīng)的輸出結(jié)果如下:

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

對slice類型脫敏處理

對slice類型的處理本質(zhì)上還是對基礎(chǔ)類型的處理,類似于結(jié)構(gòu)體或?qū)?yīng)的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類型進(jìn)行處理

對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)
}

輸出結(jié)果如下:

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}]

自定義脫敏函數(shù)

go-mask包還支持自定義的脫敏函數(shù)的處理。將定義好的函數(shù)通過mask.RegisterMaskStringFunc函數(shù)進(jìn)行注冊即可。如下,定義了regexp標(biāo)簽和MaskRegExp脫敏處理函數(shù):

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)
}

輸出結(jié)果:

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

好了,以上就是go-mask的主要功能。如果你的業(yè)務(wù)中有需要脫敏輸出的需求,推薦使用該包。

該包開源地址:https://github.com/showa-93/go-mask

到此這篇關(guān)于Golang中實(shí)現(xiàn)數(shù)據(jù)脫敏處理的go-mask包分享的文章就介紹到這了,更多相關(guān)Golang數(shù)據(jù)脫敏處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go 通過結(jié)構(gòu)struct實(shí)現(xiàn)接口interface的問題

    Go 通過結(jié)構(gòu)struct實(shí)現(xiàn)接口interface的問題

    這篇文章主要介紹了Go 通過結(jié)構(gòu)struct實(shí)現(xiàn)接口interface的問題,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • go中Excelize處理excel表實(shí)現(xiàn)帶數(shù)據(jù)校驗(yàn)的文件導(dǎo)出

    go中Excelize處理excel表實(shí)現(xiàn)帶數(shù)據(jù)校驗(yàn)的文件導(dǎo)出

    本文主要介紹了go中Excelize處理excel表實(shí)現(xiàn)帶數(shù)據(jù)校驗(yàn)的文件導(dǎo)出,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Go依賴注入工具wire的具體使用

    Go依賴注入工具wire的具體使用

    本文主要介紹了Go依賴注入工具wire的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 在Go中實(shí)現(xiàn)高效可靠的鏈路追蹤系統(tǒng)

    在Go中實(shí)現(xiàn)高效可靠的鏈路追蹤系統(tǒng)

    在當(dāng)今互聯(lián)網(wǎng)應(yīng)用的架構(gòu)中,分布式系統(tǒng)已經(jīng)成為主流,分布式系統(tǒng)的優(yōu)勢在于能夠提供高可用性、高并發(fā)性和可擴(kuò)展性,本文將介紹鏈路追蹤的概念和原理,并重點(diǎn)介紹如何在Golang中實(shí)現(xiàn)高效可靠的鏈路追蹤系統(tǒng),需要的朋友可以參考下
    2023-10-10
  • Golang使用gin框架實(shí)現(xiàn)一個(gè)完整的聊天室功能

    Golang使用gin框架實(shí)現(xiàn)一個(gè)完整的聊天室功能

    由于我們項(xiàng)目的需要,我就研究了一下關(guān)于websocket的相關(guān)內(nèi)容,去實(shí)現(xiàn)一個(gè)聊天室的功能,經(jīng)過幾天的探索,現(xiàn)在使用Gin框架實(shí)現(xiàn)了一個(gè)完整的聊天室+消息實(shí)時(shí)通知系統(tǒng),感興趣的小伙伴歡迎閱讀本文
    2023-08-08
  • 淺談Go語言多態(tài)的實(shí)現(xiàn)與interface使用

    淺談Go語言多態(tài)的實(shí)現(xiàn)與interface使用

    如果大家系統(tǒng)的學(xué)過C++、Java等語言以及面向?qū)ο蟮脑?,相信?yīng)該對多態(tài)不會(huì)陌生。多態(tài)是面向?qū)ο蠓懂牣?dāng)中經(jīng)常使用并且非常好用的一個(gè)功能,它主要是用在強(qiáng)類型語言當(dāng)中,像是Python這樣的弱類型語言,變量的類型可以隨意變化,也沒有任何限制,其實(shí)區(qū)別不是很大
    2021-06-06
  • Go開發(fā)Gin項(xiàng)目添加jwt功能實(shí)例詳解

    Go開發(fā)Gin項(xiàng)目添加jwt功能實(shí)例詳解

    這篇文章主要為大家介紹了Go開發(fā)Gin項(xiàng)目中添加jwt功能實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go語言之fo循環(huán)與條件判斷

    Go語言之fo循環(huán)與條件判斷

    這篇文章主要介紹Go語言之fo循環(huán)與條件判斷,for 循環(huán)是一個(gè)循環(huán)控制結(jié)構(gòu),可以執(zhí)行指定次數(shù)的循環(huán)。下面文章我們結(jié)合條件判斷,感興趣的朋友可以參考一下
    2021-10-10
  • 使用Go語言開發(fā)短鏈接服務(wù)的方法

    使用Go語言開發(fā)短鏈接服務(wù)的方法

    短鏈接一般是通過映射關(guān)系,將長長的一串網(wǎng)址,映射到幾個(gè)字符的短鏈接上,建立好這種映射關(guān)系之后保存到數(shù)據(jù)庫里,用戶每次訪問短鏈接的時(shí)候,這篇文章主要介紹了使用Go語言開發(fā)一個(gè)短鏈接服務(wù),需要的朋友可以參考下
    2024-03-03
  • go?colly?爬蟲實(shí)現(xiàn)示例

    go?colly?爬蟲實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了go?colly?爬蟲實(shí)現(xiàn)示例,效果是根據(jù)輸入的瀏覽器cookie及excel必要行列號,從excel中讀取公司名稱,查詢公司法人及電話號碼。并寫回到excel中指定行
    2022-09-09

最新評論