创建时加密tar.gz文件


33

我有一个脚本,可以每晚创建多个目录的备份。

它是使用创建的tar -czf,目标tar.gz文件路径位于已安装的网络目录上。生成的文件大约为1.2Gb。

网络速度相当快(从网络驱动器到本地的复制速度约为28MB /秒)。

现在,我想使用公用密钥加密对tar.gz文件进行加密,然后再将其传输到网络驱动器,并想知道这样做的最佳方法是什么。

我应该先在本地创建文件,对其进行加密,然后再复制吗?还是有办法通过加密过程“输出” tar输出,然后将结果直接写入网络驱动器?

Answers:


34

打包your_dir在加密的归档文件中your_archive.tgz.gpg(对称加密):

tar -cz your_dir | gpg -c -o your_archive.tgz.gpg

打开包装:

gpg -d your_archive.tgz.gpg | tar xz

有关如何使用非对称加密而不是对称加密的信息,请参阅GPG文档。


2
使用GPG似乎会在用户家庭持有者中创建密钥,并提示输入密码。基本上,这个过程似乎太不透明了……
Joel L

应该tar xz在第二组命令中tar -xz代替吗?
肯尼·埃维特

1
@KennyEvitt:您可以使用它,也可以不使用-
Florian Diesch,2016年

这也适用于使用gpg-zip加密的文件!
Trefex

2
gpg已经压缩了文件,不要认为该z选项会增加太多
feklee

12

以下过程首先对本地磁盘上的文件进行加密,然后可以通过网络发送(或根据需要存储)


首先,生成公钥和私钥(仅执行一次):

openssl genrsa -out key.pem 2048
openssl rsa -in key.pem -out key-public.pem -outform PEM -pubout

然后,在每次备份时:

  1. 生成长随机密码,保存在文件中

    • echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
  2. 通过阶段加密文件

    • openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
  3. 用公钥加密密码

    • openssl rsautl -encrypt -pubin -inkey key-public.pem < key.txt > enc.key.txt

然后在需要的地方保存crypto.dat和enc.key.txt。


解密:

  1. 用私钥解密加密的密码

    • openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
  2. 解密文件

    • openssl enc -aes-256-cbc -d -pass file:key.txt < encrypted.dat > UNENCRYPTED_FILE

这比Florian的答案要长得多,但是我决定使用它,以便可以更好地理解该过程,而不依赖于服务器相关的GPG配置变量等。我也找不到任何有用的GPG文档。


1
像这样通过openssl也可以轻松创建随机密码短语 openssl rand 32 -out key.txt
Wolfgang

@Wolfgang —我实际上是从python脚本(运行备份过程)生成通行证的,但是感谢您的提示!
乔尔L

2
FYI:为什么你不应该使用OpenSSL加密文件:stackoverflow.com/questions/28247821/...
丹尼尔·希勒

这个文件“ enc.key.txt”到底是什么?我正在寻找一个备份服务器文件的过程,只希望能够使用未存储在服务器上的密钥进行解密。
亚历克斯·斯图尔特

6

我通过非对称密钥加密来做到这一点。这意味着我有一个公共密钥(可以与任何我想发送给我的加密软件包共享),可以使我对该软件包进行加密。我还拥有一个私钥(我不共享),该私钥使我可以解密程序包。

我的用于加密当前工作目录的命令:-e用于加密,-r用于指定“收件人”或要使用的密钥,-o用于指定输出文件。

$ tar -cvz . | gpg -e -r ABCD1234 -o backup.tgz.gpg

并解密到当前工作目录:

$ gpg -d backup.tgz.gpg | tar -xz

或解密为标准tgz文件以供以后解压缩:

$ gpg -o backup.tgz -d backup.tgz.gpg

当然,这仅在我已经生成了公私钥对并将其与gpg一起安装的情况下才有效。就我而言,我使用了https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-on-an-ubuntu上的 Digital Ocean指南-12-04-vps。加密命令中的ABCD1234指的是我系统上安装的公共密钥之一。本指南还介绍了如何共享您的公共密钥以及如何安装其他人的公共密钥来发送和接收加密文件。


0

GnuPG是我选择用于此过程的方法,并且因为您已指出解密步骤在不透明的地方(我同意此用法实例),所以我也一直在解决该问题。检查项目的Travis-CI构建日志,以了解当前按设计工作的功能,以及用于跟踪日志的输出的travis.yml文件。基本上,您将需要此项目中的三个脚本。keygen脚本,解密帮助程序脚本和命名管道侦听器脚本。应在将执行解密的设备上使用keygen脚本和解密帮助程序脚本,并且应在执行加密的设备上使用命名管道侦听器脚本。

设置后,加密的命名管道侦听器脚本将接受字符串,文件路径或目录路径,并以可预测的方式输出加密结果。

下面是示例命令,可以将它们放在夜间备份脚本中以进行加密以及目录压缩+加密

echo "some messages text" > /path/to/named.pipe
## Message text is ASCII armor encrypted and appended to specified file when script was stated
echo "${HOME}/Documents" > /path/to/named.pipe
## Directories are compressed with tar and encrypted with output to time stamped file in bulk output directory
echo "${HOME}/.bash_history"  > /path/to/named.pipe

对于解密,你会想看看如何构建脚本.travis-ci/script_decrypt.sh.travis-ci/test_search_script_decrypt.sh如何加密数据的附加字符串回收,如何批量文件/目录恢复。

当然,在进行本实验的过程中,最好不要使用主键解析(这是编写keygen脚本的原因),并且除非您对如何将其恢复为可读形式有信心,否则不应将其用于重要数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.