Golang
主页 > 脚本 > Golang >

Go实现数据脱敏的方案设计

2024-05-19 | 佚名 | 点击:

在一些常见的业务场景中可能涉及到用户的手机号,银行卡号等敏感数据,对于这部分的数据经常需要进行数据脱敏处理,就是将此部分数据隐私化,防止数据泄露。但是在生产环境中,数据一般都是实时的,且在进行脱敏操作时不能影响正常的业务使用。

脱敏方案

脱敏方案一般会采用以下方式:

详细设计

基本脱敏方法

就目前我所使用的场景,遇到比较多的是将在展示时对数据进行部分脱敏后再展示,使用占位符替换。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

// 部分数据脱敏

func PlaceholderHandle(data string) string {

    if len(data) <= 4 {

            return strings.Repeat("*", len(data))

        }

        return data[:3] + strings.Repeat("*", len(data)-7) + data[len(data)-4:]

}

 

// 完全数据脱敏

func PlaceFullHandle(){

  return strings.Repeat("*", len(data)) 

}

 

// 使用MD5对数据进行加密

func GetMD5Hash(data string) string {

    hash := md5.Sum([]byte(text))

    return hex.EncodeToString(hash[:])

}

 

// 使用AES算法对数据进行加密

func Encrypt(data []byte, key []byte) ([]byte, error) {

    block, err := aes.NewCipher(key)

    if err != nil {

        return nil, err

    }

 

    ciphertext := make([]byte, aes.BlockSize+len(data))

    iv := ciphertext[:aes.BlockSize]

    if _, err := io.ReadFull(rand.Reader, iv); err != nil {

        return nil, err

    }

 

    stream := cipher.NewCFBEncrypter(block, iv)

    stream.XORKeyStream(ciphertext[aes.BlockSize:], data)

 

    return ciphertext, nil

}

 

// 使用AES算法对数据进行解密

func Decrypt(data []byte, key []byte) ([]byte, error) {

    block, err := aes.NewCipher(key)

    if err != nil {

        return nil, err

    }

 

    if len(data) < aes.BlockSize {

        return nil, fmt.Errorf("ciphertext too short")

    }

 

    iv := data[:aes.BlockSize]

    data = data[aes.BlockSize:]

 

    stream := cipher.NewCFBDecrypter(block, iv)

    stream.XORKeyStream(data, data)

 

    return data, nil

}

md5 是不可逆的,所以如果使用MD5 加密的话就数据就无法解密,如果使用MD5加密的话更适合的场景就是用于数据加密后没有其他用处。所以如果希望加密后再解密可以使用AES 对称加密算法进行加解密,其还支持使用Key 进行加密。

脱敏模块

场景

功能模块划分:

当遇到以上点可以考虑设计一个专门进行数据脱敏的模块,以便统一管理和调度数据脱敏逻辑从而保证数据脱敏的一致性和规范性。一个简单的数据脱敏模块大致划分三个模块:

数据源可以使用 工厂函数,根据数据源类型创建对应数据源实例从而调用方法 GetData 获取相应的数据源,后续可以增加其他数据源时只需要再工厂函数增加类型和对应的实例创建。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

type DataSource interface {

    GetData() []byte

}

 

type UserDbSource struct {

}

 

func (p *UserDbSource) GetData() []byte {

    return nil

}

 

type OrderDbSource struct {

    dbName string

}

 

func (p *OrderDbSource) GetData() []byte {

    return nil

}

 

type ThirdpartySource struct {

    url string

}

 

func (p *ThirdpartySource) GetData() []byte {

    return nil

}

 

type DataSourceFactory struct {

}

 

func (p *DataSourceFactory) CreateDataSource(sourceType string, sourceConfig string) DataSource {

    switch sourceType {

    case "file":

        return &FileSource{filePath: sourceConfig}

    case "thirdparty":

        return &ThirdpartySource{url: sourceConfig}

    case "orderDb":

        return &OrderDbSource{dbName: sourceConfig}

    case "userDb":

        return &UserDbSource{}

    }

    return nil

}

数据脱敏引擎使用策略模式,先定义不同的脱敏规则,并通过DataMaskCore接口统一了脱敏方法。在初始化DataMask结构体可以根据传入不同脱敏策略,然后在进行脱敏处理时根据不同的脱敏规则进行处理。这样可以实现根据不同规则进行不同的脱敏处理,使代码更加灵活和可扩展。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

type DataMaskCore interface {

    DoMask(data string)

}

 

// 脱敏规则1

type MaskingRule1 struct{}

 

func (mr1 *MaskingRule1) DoMask(data string) string {

    // 实现脱敏规则1的逻辑

    return "Masked Data 1"

}

 

// 脱敏规则2

type MaskingRule2 struct{}

 

func (mr2 MaskingRule2) DoMask(data string) string {

    // 实现脱敏规则2的逻辑

    return "Masked Data 2"

}

 

type DataMask struct {

    Strategy DataMaskCore

}

 

func NewDataMask(strategy DataMaskCore) *DataMask {

    return &DataMask{

        Strategy: strategy,

    }

}

 

// 根据不同规则进行不同的脱敏处理

func (p *DataMask) MaskData(data string) {

    p.Strategy.DoMask(data)

}

简单概述,数据脱敏其实本质就是对数据不可直接展示。根据自身需求对数据敏感度,可使用简单处理方式就是对数据进行占位符代替,或者直接加密处理。如果是没有用处的数据直接暴力解决—删除。

原文链接:
相关文章
最新更新