使用gpg2和bash脚本更新加密文件的内容

时间:2016-07-16 12:11:22

标签: bash encryption gnupg

说有加密文件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文档备注:"显然,这在多用户系统上的安全性非常可疑。如果可以避免,请不要使用此选项。" 这是仅在终端内手动使用时的情况,因为记录了命令?或者在使用例如时也会有顾虑在一个函数内部,密码只保存在此函数范围内。

1 个答案:

答案 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;