问题描述
我有一个创建几个目录的夜间备份的脚本。
它是使用 tar -czf
创建的,目标 tar.gz 文件路径位于已安装的网络目录中。生成的文件大约 1.2Gb 大。
网络速度相当快(从网络驱动器复制到本地的速度约为 28MB/秒)。
现在我想使用 public-key 加密来加密 tar.gz 文件,然后再将其传输到网络驱动器,并且想知道这样做的最佳方法是什么。
我应该先在本地创建文件,加密,然后复制过来吗?\n或者有没有办法通过加密过程将”stream” tar输出,然后将结果直接写入网络驱动器?
最佳回答
将 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 的文档。
次佳回答
以下过程首先加密本地磁盘上的文件,然后可以通过网络发送(或根据需要存储)
首先,生成公钥和私钥(只做一次):
openssl genrsa -out key.pem 2048
openssl rsa -in key.pem -out key-public.pem -outform PEM -pubout
然后,在每次备份时:
-
生成长随机密码,保存在文件中\n
-
echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
-
-
使用 passphase 加密文件\n
-
openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
-
-
用公钥加密密码\n
-
openssl rsautl -encrypt -pubin -inkey key-public.pem < key.txt > enc.key.txt
-
然后在需要的地方保存 encrypted.dat 和 enc.key.txt。
解密:
-
使用私钥解密加密密码\n
-
openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
-
-
解密文件\n
-
openssl enc -aes-256-cbc -d -pass file:key.txt < encrypted.dat > UNENCRYPTED_FILE\\n
-
这比 Florian 的 anwser 长很多,但我决定使用它以便更好地理解该过程,而不依赖于 server-dependent GPG 配置变量等。我也找不到任何有用的 GPG 文档。
第三种回答
我使用非对称密钥加密来做到这一点。这意味着我有一个公钥(我可以与任何我想向我发送加密包的人共享),它允许我对包进行加密。我还有一个私钥(我不共享),它允许我解密包。
我加密当前工作目录的命令:-e 加密,-r 指定 “recipient” 或要使用的密钥,-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
当然,这只适用于我已经生成了 public-private 密钥对并使用 gpg 安装它的情况。就我而言,我是使用 https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-on-an-ubuntu-12-04-vps 的 Digital Ocean 指南完成的。加密命令中的 ABCD1234 是指安装在我的系统上的公钥之一。本指南还介绍了如何共享您的公钥和安装其他人的公钥以发送和接收加密文件。