我想解密一个文件并对其进行编辑,而不将其清晰的内容写入临时文件,以避免敏感数据的泄露。
我已经用以下命令创建了原始文件:
echo -n "hello world" | gpg --encrypt --symmetric --output sensitive.gpg
我可以解密此文件并输出:
$ gpg --decrypt sensitive.gpg
gpg: AES256.OCB encrypted session key
gpg: encrypted with 1 passphrase
gpg: encrypted with cv25519 key, ID <blablabla>
hello world
但是,当我尝试将输出通过管道传输到时gpg --encrypt
,似乎两个进程同时运行并尝试同时使用 stdin:
gpg --no-symkey-cache --pinentry-mode loopback --decrypt sensitive.gpg | gpg --encrypt --symmetric --pinentry-mode loopback --output sensitive.gpg
在我输入任何密码之前,这里是输出:
gpg: AES256.OCB encrypted session key
Enter passphrase: Enter passphrase:
您可以看到它两次询问我密码。
以下是正在运行的进程:
$ ps | grep gpg
49716 ttys002 0:00.02 gpg --no-symkey-cache --pinentry-mode loopback --decrypt sensitive.gpg
49717 ttys002 0:00.01 gpg --encrypt --symmetric --pinentry-mode loopback --output sensitive.gpg
有没有什么解决方案可以gpg --encrypt
等待gpg --decrypt
它完成其工作?
我想vipe
在这两个命令之间添加一个编辑器。
该计划的这一部分与要使用的计划不兼容
vipe
,这会创建一个临时文件。如果您查看状态栏,您会看到您正在编辑/tmp/sZDlroW8Q3
或类似内容。但根据您的操作系统,它可能有办法创建内存中的临时文件。例如,Linux 通常会将 /tmp 放在内存中(尽管仍然可以交换到磁盘,但文本编辑器的进程内存已经如此)。其他系统可能具有某种“ramdisk”功能。
确实如此;这就是管道设计的工作方式。
这不是问题,因为它们的标准输入连接到不同的源:第二个进程不是从终端读取标准输入,而是从相应
|
管道的另一端读取。问题出在两个程序手动打开终端设备(/dev/tty)——这样做确实是为了它们能够在不干扰其标准输入的情况下读取密码。
管道中的进程总是同时启动。因此,解决方案取决于第二个密码提示是在 gpg 启动时立即显示,还是仅在收到数据时显示——对于解密来说可能是后者,但对于加密来说很可能是前者。
因此,您需要用包装器替换第二个 gpg,该包装器首先将其 stdin 缓冲到临时文件,然后才运行实际的 gpg。 (实际上,两种情况的脚本都相似。)
延迟启动(让脚本启动命令):
没有(一旦添加 vipe 就可能完全冗余):
再次强调,
vipe
编辑器已经以这种方式工作了——在调用常规 Vim 实例之前,它会将其输入保存到临时文件中——因此您这样做实际上并没有失去任何安全性。事实上,您也可以将其集成到脚本中。延迟启动:
如果没有延迟启动:将与其
vipe
自身相同。