重用私钥/公钥

信息安全 SSH
2021-08-09 12:41:57

我在几个第三方网站上有账户——Bitbucket、Bluehost 等。

根据我收集到的信息,通常的做法是为所有 [id_rsa, id_rsa.pub] 使用一对密钥,但只提供公钥

这是正确的用法,还是为每个站点生成一个新对更好?

在我看来,这是不安全的——任何我以邪恶意图信任的站点 [或被黑客入侵] 都可以在我第一次连接时获取我的私钥,并使用它进入其他站点。

了解 SSH 的人能否验证在任何地方使用一对密钥是安全的,如果是,或许可以解释原因?

另外,如果我有两台家用电脑,是否有任何理由使用不同的密钥对?

谢谢大家。

4个回答

您的私钥永远不会发送到其他站点,因此重复使用公钥是非常安全的。重复使用本地计算机的相同密钥也是可以的。但是,请记住,如果有人窃取了密钥,他们就可以访问所有密钥。这可能是也可能不是问题。

SSH 中有几对密钥。您正在谈论的是客户端密钥对。客户端(即在您的办公桌上,在您的物理控制下的机器)存储私钥 - 并且私钥永远不会发送到服务器。公钥存储在服务器上(通常在$HOME/.ssh/authorized_keys文件中)。

当客户端连接到服务端时,客户端使用私钥向服务端证明他控制着私钥,可以用它进行计算(即数字签名)。服务器通过公钥验证签名。公钥的知识不会赋予生成新签名的能力,这就是它被称为“公钥”的原因:它可以公开,不会产生不良影响。特别是,在任意数量的服务器上复制您的公钥并不会赋予这些服务器中的任何服务器超过其他服务器的权力,无论它们是诚实的还是完全由攻击者控制。

正如@artbristol 指出的那样,重要的是私钥。如果您将您的公钥复制到十台服务器,并且有人窃取了私钥(可能是通过侵入您的桌面系统或物理盗取它),那么有人可以立即访问这十台服务器。私钥很有价值

在我看来,这是不安全的——任何我以邪恶意图信任的站点 [或被黑客入侵] 都可以在我第一次连接时获取我的私钥,并使用它进入其他站点。

了解 SSH 的人能否验证在任何地方使用一对密钥是安全的,如果是,或许可以解释原因?

公钥基于质询身份验证工作。基本上,你给几个站点你的公钥,所以每个站点都可以向你发出挑战。这个挑战每次都是独一无二的,只能由拥有私钥的人来回答。

一个简化的示例是,如果服务器获取您的公钥并加密消息,例如“用户 X 在 12 月 19 日 16:30:03.351213 UTC 的会话密钥是 XPa7sK35WjMgAezrPmG1Sq4CV7nsFN1Uc3TRW6P8Evc”。您的客户端计算机接收到加密消息,使用您的私钥对其进行解密,然后将解密的会话密钥发送回服务器,从而验证您拥有服务器对您进行身份验证的私钥。(实际上,服务器通常更复杂,通常具有公共/私有主机密钥,因此您可以加密发送到服务器的消息并验证服务器就是它所说的那个人)。

拥有您的公钥不会给恶意服务器提供额外的攻击方法,除了尝试从您的公钥中提取模数以重新创建您的私钥。这只有在您的密钥太小时才有可能,即 512 位密钥在十年前被破解,768 位 RSA 密钥在去年被报告破解(大约 10^20 次操作;或 2000 年在现代处理器);1024 位密钥仍然是安全的,ssh 默认是 2048 位密钥。

本文档包含有关公钥身份验证如何在 SSH 中工作的所有详细信息。我总结如下。

客户端发送以下数据包:

数据类型描述/值

字节 SSH_MSG_USERAUTH_REQUEST
字符串用户名
字符串服务
字符串“公钥”
布尔值 TRUE
字符串公钥算法名称
用于身份验证的字符串公钥
字符串签名

其中签名是使用私钥对以下数据的签名:

字符串会话标识符
字节 SSH_MSG_USERAUTH_REQUEST
字符串用户名
字符串服务
字符串“公钥”
布尔值 TRUE
字符串公钥算法名称
用于身份验证的字符串公钥

然后服务器查看指定的公钥是否已被授权用于给定的公钥(@ThomasPornin 在他的回答中讨论了这是如何完成的)。然后服务器检查以确保签名正确(这是使用公钥完成的)。如果成功,则身份验证成功。

如您所见(正如@artbristol 的回答中所指出的那样),私钥永远不会传输到服务器。您只需通过发送数字签名来证明您知道私钥。