注意:这个问题已经讨论了同样的漏洞,但是问题的不同设置(在我的情况下,我不需要存储密码)允许不同的解决方案(即使用文件描述符而不是将密码保存在一个文件,请参阅ilkkachu 的回答)。
假设我有一个对称加密文件my_file
(使用 gpg 1.x),其中存储了一些机密数据,并且我想使用以下脚本对其进行编辑:
read -e -s -p "Enter passphrase: " my_passphrase
gpg --passphrase $my_passphrase --decrypt $my_file | stream_editing_command | gpg --yes --output $my_file --passphrase $my_passphrase --symmetric
unset my_passphrase
在哪里stream_editing_command
替换/附加一些东西到流中。
我的问题:这安全吗?变量$my_passphrase
和/或解密的输出是否会以某种方式可见/可访问?如果不安全,我应该如何修改脚本?
不,这并不真正被认为是安全的。密码短语将在 的输出中可见
ps
,就像所有其他正在运行的进程的命令行一样。数据本身将不可见,其他用户无法访问管道。的手册页
gpg
有这样的说法--passphrase
:当然,如果您在系统上没有其他用户并且相信您的任何服务都没有受到损害,那么应该没有人查看进程列表。
但在任何情况下,您都可以改为使用
--passphrase-fd
并让 shell 将密码短语重定向到程序。使用这里的字符串:请注意,仅当第二个
gpg
在获取完整输入之前不截断输出文件时才有效。否则,第一个gpg
可能无法在文件被截断之前读取文件。为避免使用命令行,您还可以将密码存储在文件中,然后使用
--passphrase-file
. 但是您需要小心设置文件的访问权限,之后将其删除,并为其选择适当的位置,以便密码不会实际存储在持久存储中。