我正在用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绑定。