假设我想通过知道我的 SSH 私钥密码来加密一个文件,以便只有我可以读取它。我正在共享一个存储库,我想在其中加密或混淆敏感信息。我的意思是,存储库将包含这些信息,但我只会在特殊情况下打开它。
假设我使用 SSH-agent,是否有一些简单的方法来加密文件以便只有我以后才能打开它?
我不明白为什么我应该为此使用 GPG,问题这里;基本上我知道密码,并且我只想使用与 SSH 密钥相同的密码来解密文件。这可能吗?
答案1
我认为你的要求是有效的,但另一方面它也很困难,因为你混合了对称和非对称加密。如果我错了,请纠正我。
推理:
- 您的私钥的密码只是为了保护您的私钥,而不是其他任何东西。
- 这会导致以下情况:您想要使用您的私钥来加密只有您可以解密的内容。你的私钥不是用来做这个的,你的公钥就是用来做这个的。无论您使用私钥加密的内容都可以通过您的公钥(签名)解密,这当然不是您想要的。 (通过您的公钥加密的内容只能通过您的私钥解密。)
- 因此,您需要使用公钥来加密数据,但为此,您不需要私钥密码。仅当您想解密时,您才需要您的私钥和密码。
结论:基本上,您想重复使用密码进行对称加密。您想要提供密码的唯一程序是 ssh-agent,并且该程序不会仅使用密码进行加密/解密。该密码仅用于解锁您的私钥,然后就会被遗忘。
推荐:使用openssl enc
或gpg -e --symmetric
与受密码保护的密钥文件一起进行加密。如果您需要共享信息,您可以使用两个程序的公钥基础设施来创建 PKI/信任网络。
使用 openssl,类似这样:
$ openssl enc -aes-256-ctr -in my.pdf -out mydata.enc
和解密类似的东西
$ openssl enc -aes-256-ctr -d -in mydata.enc -out mydecrypted.pdf
更新:需要注意的是,上述 openssl 命令并不能防止数据被篡改。 enc 文件中的简单位翻转也会导致解密数据损坏。上述命令无法检测到这一点,您需要使用诸如 SHA-256 之类的良好校验和来检查这一点。有多种加密方法可以以集成的方式执行此操作,这称为 HMAC(基于哈希的消息身份验证代码)。
答案2
我更喜欢使用该openssl
实用程序,因为它似乎相当普遍。
将RSA公钥和私钥转换为PEM格式:
$ openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
$ openssl rsa -in ~/.ssh/id_rsa -pubout -outform pem > id_rsa.pub.pem
使用您的公钥加密文件:
$ openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem -in file.txt -out file.enc
使用您的私钥解密文件:
$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc -out file.txt
但是,正如 Gilles 上面评论的那样,这仅适合加密小于公钥的文件,因此您可以执行以下操作:
生成密码,用它对称加密文件,然后用你的公钥加密密码,将其保存到文件中:
$ openssl rand 64 |
tee >(openssl enc -aes-256-cbc -pass stdin -in file.txt -out file.enc) |
openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem -out file.enc.key
使用您的私钥解密密码并使用它来解密文件:
$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc.key |
openssl enc -aes-256-cbc -pass stdin -d -in file.enc -out file.txt
您最终会得到两个文件,即加密文件和加密密码,但将其放入脚本中会很好地工作。
您甚至可以添加一个tar cvf file file.enc file.enc.key
来整理。
最理想的情况是,您可以最大化密码短语的大小并更改rand 64
公钥的大小。
答案3
看着卢克斯/dm-地穴。您可以通过使用适当的选项将 ssh-private-key 用作加密密钥。
更新:使用 LUKS 和 LV 块设备进行加密的示例(VG 系统中的 LV 测试):
KEY=/home/youraccount/.ssh/id_dsa
DEVICE=/dev/system/test
cryptsetup luksFormat $DEVICE $KEY
cryptsetup luksOpen $DEVICE test_crypt --key-file $KEY
这应该生成一个块设备/dev/mapper/test_crypt您可以使用它来存储数据(使用您选择的文件系统对其进行格式化后)。
要摆脱它,请卸载它,然后使用cryptsetup luksClose test_crypt
.