创建CLI:我应该如何处理配置文件中的密码(以及如何处理)



我正在用Go编写CLI,我想将密码保存到保存在用户主目录中的配置文件中。

我是否应该在保存时加密密码,并在将其发送到与CLI交互的服务器时解密?

如果是这样,在go库中是否有一个很好的内置库来做到这一点?我想让它尽可能简单,不使用任何额外的外部包。我看到的所有答案都很复杂。

应该是这样的:

func Encrypt(password string) string
func Decrypt(password string) string

任何想法?

免责声明:核心库不提供开箱即用的功能。有一个Go语言的第三方库(来自Docker)可以提供帮助。

现代操作系统提供工具和api以安全的方式存储秘密。

  • 苹果:钥匙扣
  • Linux: Secret Service
  • Windows: Credentials Manager API

Git和Docker使用这些工具来存储你的凭证。

David Calavera为Docker Engine v1.11贡献了Docker凭据助手,他写了一篇题为"停止在2016年将凭据令牌保存在文本文件中"的文章。本文描述了这个问题,一个简单的Linux实现,并展示了如何使用这个库。

package main
import (
  "github.com/docker/docker-credential-helpers/client"
  "github.com/docker/docker-credential-helpers/credentials"
)
var nativeStore = client.NewShellProgramFunc("docker-credential-secretservice")
func main() {
  c := &credentials.Credentials{
    ServerURL: "https://api.github.com",
    Username: "token",
    Secret: "my-super-secret-token",
  }
  
  client.Store(nativeStore, c)
  storedCreds, err := client.Get(nativeStore, "https://api.github.com")
}

Docker凭据助手的缺点是它需要你安装它的二进制文件,并且需要CGo。我特别添加了Docker解决方案,因为它在评论中提到过,但是有类似的库:

  • 99designs/keyring -最初是AWS vault库的一部分。
  • zalando/Go -keyring -一个纯Go实现,目的是避免C绑定。

最新更新