GPG更改对称加密密码

时间:2014-07-18 00:10:51

标签: shell unix encryption command-line gnupg

我正试图找出一种方法来更改GPG对称加密的文件的密码,而不使用临时文件或shell变量。我知道我可以在带有变量的shell函数中执行此操作,但如果可能的话,我想在命令行中执行此操作。

我认为这应该是可能的,因为GPG会使用gpg --symmetric -o example.gpg加密传入的流,因为GPG会使用gpg --decrypt将解密的输出发送到STDOUT。

但这不能正常运作:

gpg --decrypt example.gpg | gpg --symmetric -o new.gpg

我认为我对shell操作顺序和重定向的理解是错误的。特别是因为shell输出一次有多个Enter passphrase:提示。

以下是输入管道命令后的初始交互式响应:

localhost ~% gpg --decrypt example.gpg | gpg --symmetric -o example.gpg
gpg: CAST5 encrypted data
Enter passphrase: Enter passphrase

之后,我收到各种密码提示......有时我会被要求提供解密密码,然后我可以用可见的纯文本键入新密码,然后隐藏新密码确认。有时,在我被要求提供解密密码之前,我会收到新密码对话框。

我认为存在竞争条件。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

解决方案:

您需要以非交互方式告诉第一个gpg命令解密密码是什么。

  • 使用gpg2(大多数现代Linux发行版都带有这个),它看起来像这样:

    gpg --decrypt --batch --passphrase 'original passwd' example.gpg  | gpg --symmetric -o new_example.gpg
    
  • 使用gpg1,您可以使用--no-use-agent代替--batch,例如:

    gpg -d --no-use-agent --passphrase 'original passwd' example.gpg  | gpg -co new_example.gpg
    

注意:根据您的gpg版本及其配置方式,您可能还必须以相同的方式为第二个gpg命令指定密码。

根本原因:

当您使用管道组合命令行时,您的shell会在设置管道以连接每个命令后同时启动所有命令(以允许将stdout每个命令发送到stdin下一个)。

额外警告:

  1. 请勿写入您正在阅读的同一文件。它几乎永远不会达到你想要的效果。

  2. 在多用户系统上使用gpg的--passphrase选项是个坏主意,因为它使密码可供系统中的任何人检查(任何人都可以运行ps命令并在gpg命令运行时查看密码。此外,密码短语随后会保存在您的shell历史记录中。让人惊讶。如果这是一个问题,请使用--passphrase-fd--passphrase-file