基本上整个问题都在标题中:ssh 是否通过网络发送密码?当然假设使用的是通过用户名和密码登录。
我这样问是因为如果 ssh 不通过网络发送密码,即使用户将所谓的主机添加到其known_hosts 文件中,中间人也无法获取用户的密码。
有人说必须如此,所以我在评论中写了一个反例。由于现在反复出现了它还能如何工作的问题,因此我在此复制该评论。
服务器可以告诉客户端使用哪个哈希值。 [与服务器影子文件中用于哈希密码的哈希值相同。] 然后,客户端可以计算哈希值ψ,该哈希值应该位于服务器的影子文件中,但我们将其称为服务器上的哈希值ψ'。所以服务器和客户端都知道ψ。然后,客户端可以选择一个随机盐 σ 并将 (hash(ψ.σ), σ)(其中.
是串联运算符)发送到服务器。然后,服务器对 ψ'.σ 进行哈希处理,并检查从客户端接收到的元组的第一个元素是否与该哈希值匹配。如果是,则客户端知道密码。
答案1
是的。密码通过加密连接发送,但以明文形式发送到远程服务器。
通常的身份验证方法是服务器计算密码的哈希值并将其与服务器上保存的值进行比较。有多种保存哈希值的方法,并且在当前的实现中,客户端不知道服务器使用什么。 (参见例如crypt
手册页)。 (即使确实如此,简单地发送密码的哈希值也会使哈希值等同于密码。)
此外,如果服务器使用 PAM,PAM 模块可能会使用几乎任何方法来实现身份验证,其中一些方法可能需要明文密码。
但是,使用公钥进行身份验证不会将密钥发送到远程主机。 (关于此的一些解释和链接一个关于安全的问题.SE)
还有基于密码的身份验证算法,例如建议零售价,不需要以纯文本形式向另一端发送密码。尽管 SRP 似乎仅作为外部补丁针对 OpenSSH 实施。
答案2
如果您使用密码身份验证,则 SSH 会通过网络发送密码。连接是加密的,因此窃听者无法看到密码。连接已通过身份验证,前提是您不盲目点击“无法确定...的真实性”消息,因此您的密码不会发送给除合法服务器之外的任何人。
对于“为什么”的无聊答案是,这就是SSH协议需要。
不那么无聊的答案是密码身份验证必须以这种方式工作。有一些执行身份验证的方法无法以这种方式工作,但这不再是简单的密码身份验证。
大多数比简单密码身份验证更高级的身份验证协议都有一个很好的特性,即客户端不会向服务器发送任何秘密数据,恶意服务器可能会使用这些数据来冒充第三台服务器上的用户。使用SSH公钥认证是除密码之外最常见的 SSH 身份验证方法,这种方法之所以有效,是因为客户端发送包含会话标识符的数据签名(需要私钥);如果恶意服务器尝试向第三方服务器进行身份验证,则它必须生成包含不同会话标识符的数据签名,而如果没有保留在客户端上的私钥,它将无法做到这一点。
请注意,如果您使用公钥身份验证,并且必须键入密码才能使用该密钥,则这不是基于密码的身份验证。使用密钥的密码专门在客户端使用,用于从密钥文件中读取密钥。当使用公钥认证时,服务器不知道也不关心密钥是否存储在加密文件中。
密码认证需要将密码发送到服务器。发送密码的哈希值而不是密码本身并没有帮助,因为这样密码就变成了哈希值:攻击者不需要找到实际的密码,只需找到哈希值。攻击者可以通过查找实际密码进行攻击,因此没有任何改进。但是,如果攻击者在您提出的方案中找到了哈希值但没有找到密码,那就足够了。相比之下,使用普通的基于密码的身份验证,攻击者必须知道密码,知道哈希值不够好,如果密码足够强,那么攻击者将无法从哈希值中找到密码。实际上,攻击者可能知道哈希值但不知道密码的原因是攻击者设法从服务器提取密码哈希值数据库,可能是从未受保护的备份或通过服务器上的漏洞提取的。网站上的此类漏洞经常成为新闻。
您提出的协议不如标准协议好。不要推出自己的加密货币!
答案3
是的,ssh 通过网络发送密码,但是是在协商了端到端加密之后。参见第 8 节RFC 4252其中表示密码验证消息包含plaintext password in ISO-10646 UTF-8 encoding [RFC3629]
答案4
SSH 确实在加密通道内以纯文本形式通过网络发送用户 ID 和密码。这就是为什么当您连接新主机时系统会提示您接受密钥。如果已知主机遭受中间人攻击,SSH 将拒绝连接,直到您删除旧密钥。
纯文本密码可在端点、您的计算机和远程计算机上获得。可以禁用密码身份验证,在这种情况下,既不会提示输入密码,也不会发送密码到远程主机。
使用带有密码保护密钥的基于密钥的身份验证更安全。您需要将密钥添加到远程系统。公钥是一个可以通过多种机制传输的文本文件。当使用基于密钥的身份验证时,可以对密钥的使用进行限制。