在创建时加密 tar.gz 文件

Joe*_*l L 43 encryption backup tar

我有一个脚本,它创建了几个目录的夜间备份。

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

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

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

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

Flo*_*sch 47

打包your_dir加密存档your_archive.tgz.gpg(对称加密):

tar -cz your_dir | gpg -c -o your_archive.tgz.gpg
Run Code Online (Sandbox Code Playgroud)

打开包装:

gpg -d your_archive.tgz.gpg | tar xz
Run Code Online (Sandbox Code Playgroud)

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

  • gpg 已经压缩了文件,不要认为 `z` 选项会增加很多 (3认同)
  • 使用 GPG 似乎会在用户家庭持有人中创建密钥,并提示输入密码。基本上,这个过程似乎对我的口味来说太不透明了…… (2认同)

Joe*_*l L 17

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


首先,生成公钥和私钥(只做一次):

openssl genrsa -out key.pem 2048
openssl rsa -in key.pem -out key-public.pem -outform PEM -pubout
Run Code Online (Sandbox Code Playgroud)

然后,在每次备份时:

  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

然后在需要的地方保存 encrypted.dat AND 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 的 anwser 长很多,但我决定使用它以便我可以更好地理解这个过程,而不是依赖于服务器相关的 GPG 配置变量等。我也找不到任何有用的 GPG 文档。

  • 仅供参考:为什么不应该使用 openssl 加密文件:/sf/ask/1977347501/ (4认同)
  • 使用 openssl 也可以轻松创建随机密码,就像这样``openssl rand 32 -out key.txt`` (2认同)

mig*_*ile 11

我用非对称密钥加密来做到这一点。这意味着我有一个公钥(我可以与任何我想向我发送加密包的人共享),它允许我对包进行加密。我还有一个私钥(我不共享),它允许我解密包。

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

$ tar -cvz . | gpg -e -r ABCD1234 -o backup.tgz.gpg
Run Code Online (Sandbox Code Playgroud)

并解密到当前工作目录:

$ gpg -d backup.tgz.gpg | tar -xz
Run Code Online (Sandbox Code Playgroud)

或者解密为标准的 tgz 文件以供以后解包:

$ gpg -o backup.tgz -d backup.tgz.gpg
Run Code Online (Sandbox Code Playgroud)

当然,这只适用于我已经生成了一个公私钥对并使用 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 指的是我系统上安装的公钥之一。本指南还介绍了如何共享您的公钥和安装其他人的公钥以发送和接收加密文件。