我有一个脚本,可以创建几个目录的夜间备份。
它是使用创建的tar -czf
,并且目标 tar.gz 文件路径位于已安装的网络目录中。生成的文件大约 1.2Gb。
网络速度相当快(从网络驱动器复制到本地的速度约为 28MB/秒)。
现在我想在将 tar.gz 文件传输到网络驱动器之前使用公钥加密来加密它,并且想知道最好的方法是什么。
我应该先在本地创建文件,然后加密,再复制吗?或者有没有办法通过加密过程“流式传输” tar 输出,并将结果直接写入网络驱动器?
答案1
打包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
以下过程首先加密本地磁盘上的文件,然后可以通过网络发送(或根据需要存储)
首先,生成公钥和私钥(只需做一次):
openssl genrsa -out key.pem 2048
openssl rsa -in key.pem -out key-public.pem -outform PEM -pubout
然后,在每次备份时:
生成长随机密码,保存在文件中
echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
使用密码加密文件
openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
使用公钥加密密码
openssl rsautl -encrypt -pubin -inkey key-public.pem < key.txt > enc.key.txt
然后在需要的地方保存encrypted.dat和enc.key.txt。
解密:
使用私钥解密加密的密码
openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
解密文件
openssl enc -aes-256-cbc -d -pass file:key.txt < encrypted.dat > UNENCRYPTED_FILE
这比 Florian 的答案要长得多,但我决定使用它,这样我就可以更好地理解这个过程,而不是依赖于服务器相关的 GPG 配置变量等。我还找不到任何有用的 GPG 文档。
答案3
我使用非对称密钥加密来实现这一点。这意味着我有一个公钥(我可以与任何我想向我发送加密包的人共享),它允许我加密包。我还有一个私钥(我不会共享),它允许我解密包。
我的命令用于加密当前工作目录:-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 安装后才有效。就我而言,我已使用 Digital Ocean 的指南完成此操作https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-on-an-ubuntu-12-04-vps加密命令中的 ABCD1234 指的是我的系统上安装的公钥之一。本指南还介绍了如何共享您的公钥以及如何安装他人的公钥来发送和接收加密文件。
答案4
我使用了Florian Diesch 以上,但遇到了这个问题:
gpg: problem with the agent: Inappropriate ioctl for device
gpg: error creating passphrase: Operation cancelled
gpg: symmetric encryption of '[stdin]' failed: Operation cancelled
除了使用我的 Ubuntu 20.04 之外,我还需要设置 gpg:
$GPG_TTY=$(tty)
$export GPG_TTY
就像描述的一样这里
然后我就可以继续解决 Florian 的问题了!谢谢!
描述了一种略有不同的方法,该方法也适用于 Linux(Ubuntu 20.04)这里