Filter Sensitive Info In Go

My computer develop environment

1
2
3
4
5
% cat /etc/issue
Ubuntu 16.04.7 LTS \n \l

% go version
go version go1.14.6 linux/amd64

在我们的项目开发过程中,无论是网站开发、app开发、小程序开发, 都离不开用户数据以及他们的敏感数据保护。
在接口数据返回前,我们都需要对特定的数据字段进行二次处理,通常做法是删除该字段或者新建一个安全的数据结构,把数据库内容复制到新的数据结构上。
今天我们来看看另一种做法.

像这里我们的用户表, Password 是不允许被接口返回的,更加不能被查看的

1
2
3
4
type User struct {
Email string `json:"email"`
Password string `json:"password"`
}

当接口/api/user/1 返回时,旧的做法是新建一个结构类型

1
2
3
type ApiUser struct {
Email string `json:"email"`
}

这个数据类型会缺少属性Password, 然后把User的数据Copy到ApiUser中

1
2
3
4
5
6
7
8
u := User{
Email: "a@gmail.com",
Password: "This is A Password",
}

apiU := ApiUser{}

copier.Copy(&apiU, &u)

那么接下来我们就来介绍json.Unmarshaler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type User struct {
Email string `json:"email"`
Password string `json:"password"`
}

func (u User) MarshalJSON() ([]byte, error) {
type user User
cn := user(u)
cn.Password = "[SECRET]"
return json.Marshal(cn)
}
func main() {

u := User{
Email: "a@gmail.com",
Password: "This is A Password",
}

b, _ := json.Marshal(u)
println(string(b)) //{"email":"a@gmail.com","password":"[SECRET]"}
}

OK,完成了json的处理,那如果是日志工具或者在开发过程debug log打印导致的敏感数据泄漏呢?
我们就需要实现fmt.Stringer这个接口类型了, 通常用在log/fmt等package中

1
2
3
4
5
6
7
8
9
func (u User) String() string {
return "[This Is Secret Data]"
}

func main() {
...
fmt.Println(u) // [This Is Secret Data]
log.Println(u) // 2018/07/06 23:10:02 [This Is Secret Data]
}

那如果是http form request中的敏感数据保存进数据库, 怎么实现赋值给struct时实现字段加密呢?

1
2
3
4
5
6
7
8
data := make(map[string]interface{})
data["email"] = "b@gmail.com"
data["password"] = "This is B Password"

b, _ = json.Marshal(data)

u := User{}
_ = json.Unmarshal(b, &u)

一般map数据绑定到struct,都会用到json.Unmarshal, 所以我们需要User也实现UnmarshalJSON的方法。注意,这里将使用指针方法实现

1
2
3
4
5
6
7
8
9
10
func (u *User) UnmarshalJSON(b []byte) error {
type tmp User
tmpUser := tmp(*u)

_ = json.Unmarshal(b, &tmpUser)
tmpUser.Password = encrypty(tmpUser.Password)
u.Email = tmpUser.Email
u.Password = tmpUser.Password
return nil
}

到这里, 方法就介绍完了,希望也能对你有帮助吧

# golang

Thank you for reading.
This post is copyrighted by Liyuliang’s Blog.
If reproduced, please indicate the source: Liyuliang’s Blog
This blog uses Creative Commons Attribution-NonCommercial-Share-Sharing 4.0 International License Agreement to license.


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×