如何在命令行上进行非对称加密,而不依赖于已安装的密钥环等?

如何在命令行上进行非对称加密,而不依赖于已安装的密钥环等?

我的家用电脑由一台运行 Linux Mint 的 VMWare 主机和多个 VMWare 客户端组成。

我每晚都会运行备份,将我的 VHD 压缩到可移动硬盘上。

我想加密压缩图像。并且我希望在备份脚本中不包含密码的情况下进行加密。

我有几个可移动磁盘,我每天都会轮流使用,而且我每天都会带一个去上班,所以我有一个异地副本。而且我在每个备份磁盘上都包含一份备份脚本的副本,这样我就可以更轻松地弄清楚我需要做什么才能进行恢复。

我的想法是,如果我使用公钥加密,我可以用公钥加密,并需要私钥解密,然后备份脚本就可以运行而不需要密码。

(我会将私钥或私钥文件的密码保存在我的 KeePass 数据库中,并且还会将其写入我的备份媒体。)

但问题是 - 我想独立运行这个,这样我就可以解密备份,而不用使用写入备份磁盘的内容。也就是说,如果我使用 gpg,我会希望在备份磁盘上有一个 gpg 的副本,我可以自行运行,而无需安装或配置任何东西。(也就是说,不依赖于 ~/.gpgconf 等)

我还不知道如何使用 gpg 来做到这一点。手册似乎假设您将为当前用户安装和配置它,而我需要能够在没有发生任何此类事情的情况下运行它。

关于如何做的任何想法:

  • 以卸载模式运行 gpg,或者
  • 如何使用其他工具做到这一点?(openssl?)

已添加评论...

为什么我不能直接安装 gpg?

问题在于进行恢复。

假设我的系统完全崩溃,也许我的房子被烧毁了,一切都被毁了。

因此,我开始使用新电脑、裸驱动器和我最近的异地备份进行恢复。

我该怎么办?

我启动了某个可以从拇指驱动器挂载 ext4 分区的 Linux 版本,然后开始将所有内容重新组合在一起。

除了基本系统实用程序和我放在备份磁盘上的内容之外,我不能依赖任何东西。

答案1

我一直在研究这个问题,我认为我有一个方法。

首先,在进行备份之前,请执行一次:

生成 RSA 密钥对:

$ openssl genpkey -out backupkey.pem -aes-256-cbc -algorithm rsa
.................++
............................++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
$ 

使用好的密码短语 - 不是任何人都能破解的东西。六到八个随机单词效果很好。不要从最喜欢的书或歌曲中挑选引语。

接下来,从刚刚创建的 .pem 文件中提取新的公钥:

$ openssl rsa -in backupkey.pem -pubout -out backupkey.key
Enter pass phrase for backupkey.pem:
writing RSA key
$ ls -l backupkey.*
-rw-r--r-- 1 jdege jdege  800 Jan 15 20:26 backupkey.key
-rw-r--r-- 1 jdege jdege 3418 Jan 15 20:16 backupkey.pem
$ 

将它们保存在某个地方,您将在每次备份时使用它们。我将它们与我的备份脚本一起存储,并将副本放在我的 KeePass 密码数据库中。

然后,在每次备份时

生成随机会话密钥:

$ openssl rand -hex 128 > session.key
$

然后,运行备份,使结果加密成为管道中的最后一步:

$ generate-my-backup.sh |
> gzip |
> openssl enc -aes-256-cbc -pass file:./session.key -out /mnt/backups/20190115/backup.bup.gz.enc
$ 

接下来,使用公共 RSA 密钥加密会话密钥,删除会话密钥,然后将加密的会话密钥复制到备份媒体:

$ openssl rsautl -encrypt -inkey backupkey.key -pubin -in session.key -out session.key.enc
$ cp session.key.enc /mnt/backups/20190115/
$ rm session.key
$ 

并将包含您的私钥的文件复制到您的备份媒体:

$ cp backupkey.pem /mnt/backups/20190115/
$ 

如果你必须恢复

如果你知道私钥的密码,那就很简单了:

$ openssl rsautl -decrypt -inkey backupkey.pem  -in session.key.enc |
> openssl enc -d -aes-256-cbc -in backup.bup.gz.enc -pass stdin |
> gunzip |
> restore-my-backup.sh
Enter pass phrase for backupkey.pem:
$

我们运行“openssl rsautl”将加密的会话密钥解密到标准输出,然后运行“openssl enc -d”解密备份文件,从标准输入读取其密钥,并将输出写入标准输出,这样它就可以传递给管道中其他需要将文件放到其所属位置的地方。

相关内容