<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何使用 Go 語言對數(shù)據(jù)進(jìn)行脫敏?

          共 6635字,需瀏覽 14分鐘

           ·

          2023-05-13 14:26

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

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

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

          特征

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

          支持的tags標(biāo)簽

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

          tag type 描述
          mask:"filled" string 輸出和原字符串相同個數(shù)的脫敏字符。例如:原字符串是4個字符,那么就輸出4個星號:****
          mask:"filledXXX" string XXX是脫敏字符的個數(shù)。即輸出XXX個脫敏字符。例如:mask:"filled3"代表最終輸出"***"
          mask:"fixed" string 輸出固定個數(shù)的脫敏字符,默認(rèn)是8個字符。例如:********
          mask:"hash" string 對原字符串使用sha1哈希輸出。
          mask:"randomXXX" int / float64 XXX代表數(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個脫敏字符:?********
          }

          對結(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


          ---特別推薦---


          瀏覽 189
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  插入小穴视频 | 国产久久视频在线观看 | 国产精品久久久精品 | 亚洲精品无码在线观看 | A片小视频|