【问题标题】:GPG decrypting/encrypting string in memory onlyGPG 仅在内存中解密/加密字符串
【发布时间】:2021-01-21 22:21:16
【问题描述】:

背景:

我有一个 GPG 加密机密,不得将其写入未加密的文件。 假设它位于~/.secrets/.mysecret.gpg

运行gpg ~/.secrets/.mysecret.gpg 会解密.mysecret.gpg 并将其保存到.mysecret 的文件中(不可接受)。运行 gpg -d ~/.secrets/.mysecret.gpg 仅打印解密的密钥(谢谢 JustinC)。

为了避免stderr并将其编码为base64以供我使用,我编写了这个shell函数作为一种方便的方法:

keyreader() {
  local gpg_file=$1
  echo -n "$(gpg -d "$gpg_file" 2> /dev/null)" | base64
}

运行keyreader ~/.secrets/.mysecret.gpg,输入加密后的secret密码后,打印出base64编码、解密后的secret,没有输出文件。

问题:

  1. gpg -d ~/.secrets/.mysecret.gpg 运行时,gpg 是否会写入一个包含未加密.mysecret 的tmp 文件?

  2. 当我使用上述语法时,为什么 gpg 不输出文件 .mysecret? (回答:使用了-d 标志,再次感谢JustinC)。

  3. 假设我在运行命令之前使用了适当的 $HISTIGNORE 标识符,我如何在不先将其未加密的情况下将其写入文件的情况下将命令行中的字符串加密为 .gpg AES256 加密文件?

对于第三季度,类似:

$ echo "secret info" | gpg --cipher-algo AES265 -c -o secrets_file.txt.gpg

代替:

$gpg --cipher-algo AES265 -c secrets_file.txt

【问题讨论】:

    标签: unix gnupg cat password-encryption


    【解决方案1】:

    再次感谢@JustinC,感谢您的回答。

    为了完整起见,这是我仅在内存中加密/解密字符串的解决方案:

    加密:

    # notice the space before echo here
    # it is the default $HISTIGNORE flag which can be set in the ~/.bashrc
    # it keeps this line from being written to the ~/.bash_history file
    
     echo -n 'your secrets here' | gpg -c > ~/.secrets/.mysecret.gpg
    
    # Enter passphrase:
    

    解密:

    # 2> /dev/null: skip printing strerr
    
    gpg -d ~/.secrets/.mysecrets.gpg 2> /dev/null
    

    注意:如果您收到错误“不适合设备的 ioctl”,您可能正在 WSL 上运行,这可能会对您有所帮助:

    # https://d.sb/2016/11/gpg-inappropriate-ioctl-for-device-errors
    
    echo -e "use-agent\npinentry-mode loopback" >> ~/.gnupg/gpg.conf
    echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf
    echo RELOADAGENT | gpg-connect-agent
    

    【讨论】:

      【解决方案2】:

      您确定gpg -d ~/.secrets/.mysecret.gpg 将解密文件写入磁盘吗?它不适合我。

      1. 您可以使用 strace 检查是否创建了任何临时文件。

      2. 我有时会通过键入以下内容来防止在 bash 历史记录中留下密码:

      PP=`cat`
      secret-info ENTER Ctrl+D
      echo $PP  # will print "secret-info"
      

      secret-info 字符串被发送到 cat 程序,而不是 shell,因此 bash 不会将其保存到历史文件中。

      【讨论】:

      • 感谢您的回答!我意识到我在测试时没有通过-d 标志,这就是为什么它将未加密文件写入磁盘的原因。我意识到字符串问题的加密是由于没有正确配置 gpg 引起的(因为我使用的是 WSL)。 This blog 为其他有相同问题的人提供有关此配置的信息。我编辑了我的问题以反映您的 cmets。顺便说一句,非常酷的猫戏法!
      猜你喜欢
      • 2011-09-02
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 2012-07-01
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多