![如何在命令行上进行非对称加密,而不依赖于已安装的密钥环等?](https://linux22.com/image/1579551/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8A%E8%BF%9B%E8%A1%8C%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86%EF%BC%8C%E8%80%8C%E4%B8%8D%E4%BE%9D%E8%B5%96%E4%BA%8E%E5%B7%B2%E5%AE%89%E8%A3%85%E7%9A%84%E5%AF%86%E9%92%A5%E7%8E%AF%E7%AD%89%EF%BC%9F.png)
我的家用电脑由一台运行 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”解密备份文件,从标准输入读取其密钥,并将输出写入标准输出,这样它就可以传递给管道中其他需要将文件放到其所属位置的地方。