带有三重管道和密钥文件的GPG

时间:2014-03-16 10:24:56

标签: linux bash shell encryption gnupg

我想tar,使用xz压缩,然后使用密钥文件使用gpg对称加密。 我可以通过for循环来实现这一点,但我更愿意通过管道来实现。

我尝试了以下操作,但由于"不明确的输入重定向而导致其无法正常工作":

tar cvf /home/user/backupdir | xz -1 | gpg -c --batch --passphrase-fd 0 --yes --symmetric --cipher-algo TWOFISH --digest-algo SHA512 -o backupdir.tar.xz.gpg < keyfile

有人可以帮我解决这个问题吗,通过管道进行加密和解密?

谢谢!

3 个答案:

答案 0 :(得分:3)

你基本上是这样做的:

tar | xz | gpg <file

在这个链中,你告诉gpg从文件和上一个命令中获取输入。

您只能从两个来源读取一个STDIN。

手册页提供了一些解决方案:

   --passphrase-fd n
          Read the passphrase from file descriptor n. Only the first line will
          be  read  from file descriptor n. If you use 0 for n, the passphrase
          will be read  from  STDIN.  This  can  only  be  used  if  only  one
          passphrase  is  supplied.  Note that this passphrase is only used if
          the option --batch has also been given.  This is different from gpg.

   --passphrase-file file
          Read the passphrase from file file. Only the first line will be read
          from file file. This can only be used if only one passphrase is sup‐
          plied. Obviously, a passphrase stored in a file is  of  questionable
          security if other users can read this file. Don't use this option if
          you can avoid it.  Note that this passphrase is  only  used  if  the
          option --batch has also been given.  This is different from gpg.

   --passphrase string
          Use  string  as  the  passphrase.  This can only be used if only one
          passphrase is supplied. Obviously,  this  is  of  very  questionable
          security  on  a  multi-user system. Don't use this option if you can
          avoid it.  Note that this passphrase is  only  used  if  the  option
          --batch has also been given.  This is different from gpg.

由于您已在文件中使用密码,因此第二个选项对您来说很合适。

如果第二个选项不可用或无法使用你的gpg版本,你可以使用第一个选项:

gpg --passphrase-fd 3 3<keyfile

在这种情况下,gpg将获取STDIN上的数据和文件描述符3上的密钥文件。

答案 1 :(得分:1)

在你的情况下,

gpg从stdin获取加密数据,但你也指定密码来自stdin,--passphrase-fd 0。这会让gpg感到困惑。

可能cat另一个文件描述符(例如3)的密钥文件,在开头使用cat keyfile > &3,然后使用--passphrase-fd 3

答案 2 :(得分:1)

对于这些情况,存在命名或匿名管道。您的命令行也有多个设计缺陷。

1)仔细阅读联机帮助页。来自gpg的-c和--symmetric标志也是如此。

2)gpg使用压缩作为标准,因此命令行中有两种压缩方案。删除xz或使用gpg中的-z 0标志。

3)-cipher-algo和--digest-algo flags,没有按你的想法行事,在这里也没用。它们仅用于邮件加密。使用--s2k- *标志代替对称加密。

示例:

KEY="secret" or KEY="$(cat /path/to/keyfile)"
tar -cvf - /home/user/backupdir | gpg --yes --batch --symmetric --passphrase-file <(echo "$KEY") --s2k-cipher-algo twofish --s2k-digest-algo sha512 -o backupdir.tar.gpg

&lt;(....)被称为匿名管道,(....)之间的结果将是一个文件描述符(主要是/ dev / fd / 63),其中包含您的密码。此文件描述符仅在gpg的生命周期内存在,并且只有gpg可以立即读取或写入。此外,命令行将始终在ps,top或/ proc / PID / cmdline中显示/ dev / fd / 63,而不是原始密码。因此,这是一种将密码短语移交给进程的安全方法,这些进程无法从标准输入中读取密码。