说有加密文件file.txt
为了更新其内容,必须首先解密文件,然后运行所需的处理,之后必须再次加密。
(1)在使用gpg2进行bash脚本编写时,最直接的方法是什么?该操作应仅请求用户一次密码才能解密。之后应该使用相同的密码进行最终加密。
这是一个非常不安全的,但我努力实现的实例:
function update-encrypted-file() {
read pass_tmp;
local pass=$pass_tmp;
unset pass_tmp;
local file="file.txt";
local tmp_result=$(cat $file | gpg2 --batch --passphrase $pass | update);
echo $tmp_result | gpg2 -c --batch --passphrase $pass > $file;
}
而更新可能是......像这样:alias update="tr -d X"
(删除所有X' s)
(2)究竟什么能使上面的例子不安全?我想使用read
本身是不行的,但看到原因会很有趣。没有本地设置的变量会导致密码在短时间内进入全局空间。这有可能被拿走吗?在这种情况下,我无法弄清楚如何使用pinentry-tty(参见this post)
(3)除此之外,关于--passphrase
选项的gpg2文档备注:"显然,这在多用户系统上的安全性非常可疑。如果可以避免,请不要使用此选项。"
这是仅在终端内手动使用时的情况,因为记录了命令?或者在使用例如时也会有顾虑在一个函数内部,密码只保存在此函数范围内。
答案 0 :(得分:1)
我没有直接回答您的个人问题,但对密码管理和GnuPG略有讨论,但对于第三个问题:来自所有所有进程的命令行 任何人可以使用机器上运行的用户。要确认,只需运行一个简单的ps ax
作为非特权用户。永远不要将秘密作为参数传递!
显然,最安全的选择是永远不会得到所有的密码。如果你没有它,你就不会搞砸它。使用GnuPG 2.1,这甚至应用于实际的GnuPG二进制文件(gpg
/ gpg2
):最关键的密钥操作(涉及处理密码)由小gpg-agent
执行(因此具有较小的攻击面),相当大且复杂的GnuPG二进制文件既没有直接访问密钥也没有密码短语。
这也是我想要的:不是处理密码,而是依靠gpg-agent
代替。无论如何,它都可用(并且自GnuPG 2.1起,也需要)。如果配置正确(这是默认设置),gpg-agent
将缓存密码短语一段时间。如果用户配置了其他内容,他认为他不想要缓存的密码短语,你也应该尊重你的应用程序。
根据需要,gpg-agent
将通过配置的方法向用户查询密码短语 - 如果您正在运行图形用户界面,则可能会弹出一个窗口。
如果您搞乱了GnuPG配置(例如,您自己的配置文件,开始自己的gpg-agent
,...),那么您的工作当然是要处理这个问题。要启动您自己的gpg-agent
实例以完全控制缓存和其他选项,请根据您的个别用例的要求利用--options
,--homedir
和--no-use-standard-socket
。
最后,您要存储内容的中间结果,即echo
:
local tmp_result=$(cat $file | gpg2 --batch --passphrase $pass | update);
echo $tmp_result | gpg2 -c --batch --passphrase $pass > $file;
出于与密码短语相同的原因,请不要这样做!相反,直接将结果传递到加密过程(此处不需要cat
):
< $file gpg2 --batch --passphrase $pass | update | gpg2 -c --batch --passphrase $pass > $file;