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