Go - 配置文件加密
2019-09-02
Coding
Golang
Encrypt
👋 ‍️‍️阅读
❤️ 喜欢
💬 评论

Go - 配置文件加密

任何应用都不可避免地要使用配置文件,而一些配置信息包含敏感信息,如果明文放在配置文件中上传到远程仓库里显然是不合适地。

一种做法是在仓库里不记录敏感信息,而在生产环境下单独配置。这样虽然保护了信息但是会变得非常麻烦,换一个环境又要重新配置。

而我的做法是直接在配置文件中加密,通过一个统一密钥来管理所有的敏感信息。

例子

我们有如下配置项

wechat:
  user: XDean
  app-id: my-appid
  app-secret: my-secret-id
admin:
  username: XDean
  password: my-password

对应的我们有

type Config struct {
	Wechat struct {
		User      string `yaml:"user"`
		AppId     string `yaml:"app-id"`
		AppSecret string `yaml:"app-secret"`
	} `yaml:"wechat"`

	Admin struct {
		Username string `yaml:"username"`
		Password string `yaml:"password"`
	} `yaml:"admin"`
}

其中app-id, app-secret, password都是敏感信息。

加密

导入xconfig

import "github.com/xdean/goex/xconfig

xconfig.EncryptString来加密我们的信息,其接收两个参数

  • 待加密信息
  • 密钥
fmt.Println(xconfig.EncryptString("my-appid", "123456"))

替换

用生成的密文替换明文信息

wechat:
  user: XDean
  app-id: ENC~GtBlP0j50TWm3+G3gB+4jjH3NcbGI5HIh2C0FD4H1lkumjMX
  app-secret: ENC~2cJ5xtNNQDW1Vm39deMzGttXNV1rMNbpPXXMC0p35nAZU9CglnOx2w==
admin:
  username: XDean
  password: ENC~upbs5xX+jwYyVKolYkoysvqo3h6pyjYM+Pf/L6//GeuPV+kSAoYu  

解密

在代码读取配置文件后进行解密

// 只做示例故不处理error
file, _ := os.Open("config.yaml")
decoder := yaml.NewDecoder(file)
config := new(Config)
_ = decoder.Decode(config)
//解密,生产环境中密钥应从外部配置中来,如命令行参数或者环境变量 //HL
_ = xconfig.Decode(config, "123456")  //HL
// 现在你的config对象已经解密

原理

原理很简单,循环遍历struct的所有field,解密所有ENC~开头的字符串。详见源码。


Copyright © 2020-2022 Dean Xu. All Rights reserved.