是否可以使用 SSH 代理进行通用数据加密?

信息安全 SSH 文件加密
2021-08-15 10:59:42

是否可以使用正在运行的 SSH 代理来解密某些数据(作为字符串提供或从文件中读取)?

3个回答

不,至少在 OpenSSH 中不是这样——没有在这种模式下运行的选项。它用于对远程服务器进行身份验证(验证身份),然后加密ssh客户端应用程序和远程sshd服务器之间的网络流量。

您可以尝试从 OpenSSH 编译一个使用其加密模式的库,并基于该库创建一个可执行文件以使用加密,但 OpenSSH 的作者并没有尝试这样做。这是一个 github 存储库,它采用openssh 并尝试将其转换为其他应用程序可以使用的库。

OpenSSH 使用在 OpenSSL 中实现的众所周知的协议;例如,我的 ssh 连接现在使用 aes128-ctr 与 hmac-md5 加密以验证完整性(组合)。当然,如果您实际跟踪查看 aes128-ctr 的来源,您会发现它最终取自OpenSSL library(即在libopenssh/cipher.c中告诉aes128_ctr使用EVP_aes_128_ctr哪个正在通过头文件 #include "cipher.h"(libOpenSSH其中包括#include <openssl/evp.h>(注意 OpenSSL),它定义EVP_aes_128_ctr最终追溯到在openssl中实现(在一些包装器处理不同的模式/大小之后) /crypto/aes/aes_core.c


编辑:

抱歉,我不清楚你在说什么ssh-agent

至于使用加载到 ssh-agent 中的私钥来加密或解密消息,那是不可能的。的全部目的ssh-agent是将私钥的使用限制为仅一个可接受的功能(ssh 中的身份验证)。

查看ssh-agent的源代码和PROTOCOL.agent中的功能描述。为了安全起见,ssh-agent 提供了一个非常有限的接口来使用存储的 ssh 私钥。

对于 ssh2,私钥的唯一用途是使用您的私钥对请求进行签名使用 ssh1 也有进程身份验证挑战,但你真的不应该再使用 ssh1 了。其他功能不使用私钥,而是处理密钥管理。

SSH1 中的主要挑战是研究员首先,远程端发送一个挑战——一个用用户的公钥加密的随机位串(从authorized_keys 文件中得知)。用户将质询发送给ssh-agent,后者使用私钥解密质询消息。然后,ssh-agent 获取随机位串并计算它的加密散列,并将加密散列发回。这验证了用户是否拥有私钥,并且只泄露了解密消息的哈希值——而不是实际的解密消息。

SSH2 中的主要挑战现在通过发送签名请求来解决。同样,远程服务器向用户发送一个随机位串。然后 ssh-agent 获取该随机位串并使用他们的私钥对该消息进行加密签名——不执行解密。签名被发回,服务器通过使用公钥验证签名来验证签名。

在 RSA 的上下文中,公钥是 ( N = p*q, e) 和私钥 ( N, d),其中 d 是这样构造的d*e ≡ 1 (mod (p-1)(q-1))(可以通过 Euclid 的扩展算法知道 e、p 和 q 有效地计算 d)。然后签名的方法是对随机消息进行散列(使用 SHA1)h = sha1(r),然后使用私钥将散列提高到幂S = h^d (mod N)S然后服务器使用用户的公钥验证签名,根据S^e (mod N)欧拉总定理计算哪个是发送消息的哈希值,并将其与 进行比较S^e ≡ (h^d)^e ≡ h^(d*e) ≡ h^(1 + (q-1)(p-1)) ≡ h (mod N)

无法使用 SSH 代理对使用公钥加密的数据进行非对称解密,因为 SSH 代理仅公开了使用私钥进行签名的能力,而不是解密的能力。

但是,您可以使用 SSH 代理中的私钥是唯一可以为某物生成签名并将该签名用作对称密钥的事实。

我做了sshcrypt来做到这一点。

我受到 leighmcc 的回答的启发,并在 bash 中实现了它唯一的依赖项是 bash、ssh-add 和 openssl。

encryptFile path [seed] [pubkey-match]

种子用于生成秘密,它是可选的,默认为空字符串。如果您加载了正确的私钥,您将始终为相同的种子生成相同的秘密。