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

22 ssh encryption

假设我想通过知道我的 SSH 私钥密码来加密一个文件,以便只有我可以读取它。我正在共享一个存储库,我想在其中加密或混淆敏感信息。我的意思是 repo 将包含信息,但我只会在特殊情况下打开它。

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

  2. 我不明白为什么我应该为此使用 GPG,请在此处提问;基本上我知道密码,我只想用与我的 SSH 密钥相同的密码解密文件。这可能吗?

vas*_*uez 27

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

推理:

  1. 您的私钥的密码是保护您的私钥,仅此而已。
  2. 这会导致以下情况:您想使用您的私钥来加密只有您可以解密的内容。你的私钥不是用来做那个的,你的公钥是用来做那个的。无论你用你的私钥加密什么都可以用你的公钥(签名)解密,这当然不是你想要的。(任何被你的公钥加密的东西只能被你的私钥解密。)
  3. 所以你需要使用你的公钥来加密你的数据,但为此,你不需要你的私钥密码。只有当你想解密它时,你才需要你的私钥和密码。

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

建议:使用openssl encgpg -e --symmetric使用密码保护的密钥文件进行加密。如果您需要共享信息,您可以使用两个程序的公钥基础设施来创建 PKI/信任网络。

使用openssl,是这样的:

$ openssl enc -aes-256-ctr -in my.pdf -out mydata.enc 
Run Code Online (Sandbox Code Playgroud)

和解密类似的东西

$ openssl enc -aes-256-ctr -d -in mydata.enc -out mydecrypted.pdf
Run Code Online (Sandbox Code Playgroud)

更新:需要注意的是,上述 openssl 命令不能防止数据被篡改。enc 文件中的简单位翻转也会导致解密数据损坏。上面的命令无法检测到这一点,您需要使用例如 SHA-256 之类的良好校验和进行检查。有一些加密方法可以以集成的方式执行此操作,这称为 HMAC(基于哈希的消息身份验证代码)。

  • 您说得对,SSH 密钥是非对称密钥,不适合加密文件。因此,您最后提供的命令将不起作用。您正在尝试使用 RSA 加密文件,但您只能使用 RSA 加密非常小的有效负载(模数的大小减去填充)。通常的方法是生成一次性对称密钥,用 RSA 加密,然后用对称密钥加密真实数据。可以在 gpg 中导入 ssh 密钥,这将是实现 hhh 要求的明智方法——但是将 gpg 与 gpg 密钥一起使用是正确的做法。 (5认同)

kwa*_*ick 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
Run Code Online (Sandbox Code Playgroud)

使用您的公钥加密文件:

$ openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem -in file.txt -out file.enc
Run Code Online (Sandbox Code Playgroud)

使用您的私钥解密文件:

$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc -out file.txt
Run Code Online (Sandbox Code Playgroud)

但是,正如 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
Run Code Online (Sandbox Code Playgroud)

使用您的私钥解密密码短语并使用它来解密文件:

$ 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
Run Code Online (Sandbox Code Playgroud)

你最终会得到两个文件,你的加密文件和你的加密密码,但是把它放在一个脚本中它会很好地工作。

你甚至可以添加一个tar cvf file file.enc file.enc.key来整理。

最理想的是,您可以最大化密码短语rand 64的大小并更改为公钥的大小。

  • 才发现这个,不错的帖子。我发现您可以从 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 字节。 (2认同)

Nil*_*ils 6

看看luks/dm-crypt。您可以使用适当的选项将 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
Run Code Online (Sandbox Code Playgroud)

这应该生成一个块设备/dev/mapper/test_crypt,您可以使用它来存储您的数据(在使用您选择的文件系统对其进行格式化之后)。

要摆脱它,请卸载它,然后使用cryptsetup luksClose test_crypt.

  • @Nils 但是当他更改私钥的密码时会发生什么,他现在将无法解密他的文件,因为密钥文件中的数据已更改。`--key-file` 确实是一个糟糕的选项名称,它应该是 `--password-file` (4认同)
  • 我不认为这会做你认为的那样。cryptsetup 的`--key-file` 选项使用文件的实际内容作为一个大密码。它不会从文件中读取 openssl 密钥并使用它。如果需要,您可以将随机字节文件用于 `--key-file`。 (2认同)