仅使用SSH -priv-key加密文件?


22

假设我想对文件加密,以便仅通过了解我的SSH私钥密码才能读取它。我正在共享一个我想对敏感信息进行加密或混淆的存储库。通过这种方式,我的意思是该回购将包含该信息,但仅在特殊情况下才将其打开。

  1. 假设我使用的是SSH代理,是否有一些简单的方法可以加密文件,只供我稍后打开?

  2. 我不明白为什么我应该使用GPG对于这一点,问题在这里 ; 基本上,我知道密码,并且只想使用与SSH密钥相同的密码解密文件。这可能吗?

Answers:


27

我认为您的要求是有效的,但另一方面,这也很困难,因为您正在混合使用对称和非对称加密。如果我错了,请纠正我。

推理:

  1. 私钥的密码短语是为了保护您的私钥而不是其他任何东西。
  2. 这将导致以下情况:您想使用私钥来加密只有您才能解密的内容。您的私钥不是用于此目的的,而您的公钥则可用于此。无论您用私钥加密的任何内容都可以通过公钥(签名)解密,这当然不是您想要的。(通过公钥加密的任何内容都只能通过私钥解密。)
  3. 因此,您需要使用公用密钥来加密数据,但为此,您不需要专用密钥密码。仅当您想要解密它时,才需要您的私钥和密码。

结论:基本上,您想重新使用密码短语进行对称加密。您要提供密码短语的唯一程序是ssh-agent,并且该程序不仅使用密码短语进行加密/解密。密码仅用于解锁您的私钥,然后被忘记。

建议:使用openssl encgpg -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(基于哈希的消息身份验证代码)。


5
没错,SSH密钥是非对称密钥,不适合加密文件。因此,您最后提供的命令将不起作用。您正在尝试使用RSA加密文件,但只能使用RSA(很小的有效载荷(模数减去填充)加密)。通常的方法是生成一次性对称密钥,使用RSA对其进行加密,并使用对称密钥对实际数据进行加密。可能可以在gpg中导入ssh密钥,这是实现hhh要求的明智方式-但是将gpg与gpg密钥一起使用是正确的做法。
吉尔(Gilles)'所以

1
为什么您建议使用对称-flag的gpg?它也"gpg -e something"适用于不同情况?

1
@hhh我假设您不会共享文件,因此仅使用普通对称比使用公共密钥加密更安全。不需要公共/专用密钥对等。pgp.net / pgpnet / pgp-faq/…:“仍然认为RSA是PGP链中最薄弱的环节。” 这也适用于其他公钥机制,例如x509。
vasquez 2012年

1
openssl -one-liner会是什么样子?相当于$ gpg -e --symmetric什么?

1
使用它来加密:openssl enc -aes-256-cbc -in my.pdf -out mydata.enc,解密:openssl enc -aes-256-cbc -d -in mydata.enc -out mydecrypted.pdf两个命令都要求输入密码。看到man enc(在Rh / fedora的/ centos的),用于像密钥文件的所有选项,base64编码等
Vasquez的

21

我宁愿使用该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为公共密钥的大小。


考虑到OP的古怪要求,做得非常好。
rsaw 2012年

2
才发现这个,不错的帖子。我发现可以从ssh-key生成的最大大小对称密钥比ssh-key本身短12个字节,否则rsautl将失败,因为“数据对于密钥大小而言太大”。因此,这在脚本中起作用:KEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')自动生成密钥长度。给定ssh-keygen的最小密钥长度为768位,这仍将导致最小对称密钥为672位或84字节。
markf 2012年

6

查看luks / dm-crypt。您可以使用适当的选项将ssh-private-key用作加密密钥。

更新:使用带有LU块设备的LUKS进行加密的示例(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


您是否可以让MVO这样做,以便轻松重用?"$ sudo apt-get install cryptmount crypt-setup; cat '...' > bin/myEncrypt.sh; chmod +x bin/myEncrypt.sh; ./bin/myEncrypt.sh; ...; ..."如果我理解正确,则此方法是文件系统级加密。它加密您需要umount / mount的fs,还是我误读了此文件?

2
我认为这并没有您认为的那样。--key-filecryptsetup 的选项使用文件的实际内容作为一个大密码。它不会从文件中读取openssl密钥,而只是使用它。您可以根据需要使用随机字节文件--key-file
Patrick

@hhh是的,这是FS级加密。
尼尔斯2012年

4
@Nils,但是当他更改私钥上的密码时会发生什么,他现在将无法解密自己的文件,因为密钥文件中的数据已更改。--key-file确实是该选项的错误选择名称,应该是--password-file
Patrick

1
@Patrick这是真的-更改密码短语将更改文件,从而更改密钥(从luks的角度来看)。但是即使从ssh的角度来看,我也不会将其命名为密码文件。我知道我的回答并没有达到目标-但我认为它将提供一些想法。
尼尔斯2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.