encryption - 创建CLI : What should I do with the password in the config file (and how)?

原文 标签 encryption go command-line-interface

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

我应该在保存时对密码进行加密,然后将其发送到CLI与之交互的服务器时解密吗?

如果是这样,那么go库中是否有内置的库可以做到这一点?我想使其尽可能简单,并且不使用任何其他外部包。我看到的所有答案都非常复杂。

应该是这样的:

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

有任何想法吗?

最佳答案

免责声明:核心库不提供开箱即用的功能。 Go的第三方库(来自Docker)可以提供帮助。
现代操作系统提供工具和API,以安全方式存储 secret 信息。

  • 苹果:钥匙串(keychain)
  • Linux:特勤局
  • Windows:凭据管理器API

  • Git和Docker使用这些工具来存储您的凭据。
    在Docker Engine v1.11中贡献了Docker credential helpers的David Calavera在2016年发表了一篇名为Stop saving credential tokens in text files的文章。该文章描述了该问题,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绑定(bind)。
  • 相关文章:

    amazon-web-services - AWS S3存储桶加密

    c++ - C++ ROT-13给出了我没想到的结果

    go - 如果websocket握手超时设置为0,会发生什么情况

    go - 添加gokogiri依赖性导致`Killed:9`退出

    php - 如何为SSH session 设置PHP版本?

    javascript - 在另一个NodeJS进程中执行一个JS文件(带有日志等)。

    phpunit - CLI上的PHPunit结果输出未显示测试名称

    java - Java中的rc4加密和解密

    python - python的诅咒。将Ansi颜色代码从stdin转换为curses输出

    go - golang错误:运行go get时找不到目录包