Ssh

ssh 是否通過網路發送密碼?

  • July 25, 2016

基本上整個問題都在標題中:ssh 是否通過網路發送密碼?當然假設使用通過使用者名和密碼登錄。

我問是因為如果 ssh 不通過網路發送密碼,即使使用者將所謂的主機添加到他們的 known_hosts 文件中,中間的人也無法獲取使用者的密碼。


有人說必須,所以我在評論中寫了一個反例。由於現在反復出現它可能如何工作的問題,我在此處複製該評論。

伺服器可以告訴客戶端使用哪個雜湊。

$$ The same one which is used to hash the passwords in the server’s shadow file. $$客戶端然後可以計算應該在伺服器影子文件中的雜湊ψ,但讓我們呼叫伺服器上的那個ψ’。所以伺服器和客戶端都知道ψ。然後,客戶端可以選擇一個隨機鹽 σ 並將 (hash(ψ.σ), σ) (其中.是連接運算符)發送到伺服器。伺服器然後散列ψ’.σ 並檢查它從客戶端接收到的元組的第一個元素是否與該散列匹配。如果是,則客戶端知道密碼。

如果您使用密碼身份驗證,則 SSH 通過網路發送密碼。連接是加密的,所以竊聽者看不到密碼。連接是經過身份驗證的,前提是您不要盲目點擊“無法建立…的真實性”消息,因此您的密碼不會發送給合法伺服器以外的任何人。

“為什麼”的無聊答案是,這就是SSH 協議所要求的。

不那麼無聊的答案是密碼身份驗證必須以這種方式工作。有一些方法不能以這種方式執行身份驗證,但這不再是簡單的密碼身份驗證。

大多數比簡單密碼身份驗證更高級的身份驗證協議都具有良好的屬性,即客戶端不會向伺服器發送任何秘密數據,惡意伺服器可以使用這些數據在第三個伺服器上冒充使用者。使用 SSH公鑰身份驗證,這是除密碼之外最常見的 SSH 身份驗證方法,這是因為客戶端發送了包含會話標識符的數據簽名(需要私鑰);如果惡意伺服器試圖向第三台伺服器進行身份驗證,它必須生成包含不同會話標識符的數據簽名,如果沒有保留在客戶端上的私鑰,它將無法做到這一點。

請注意,如果您使用公鑰身份驗證,並且您必須輸入密碼才能使用該密鑰,則這不是基於密碼的身份驗證。使用密鑰的密碼僅在客戶端使用,以從密鑰文件中讀取密鑰。使用公鑰認證時,伺服器不知道也不關心密鑰是否儲存在加密文件中。


密碼驗證需要將密碼發送到伺服器。發送密碼的散列而不是密碼本身並沒有幫助,因為這樣密碼就變成了散列:攻擊者不需要找到實際的密碼,只需找到散列即可。攻擊者可以通過查找實際密碼進行攻擊,因此沒有任何改進。但是,如果攻擊者在您提出的方案中找到了雜湊而不是密碼,那就足夠了。相比之下,普通的基於密碼的身份驗證,攻擊者必須知道密碼,知道雜湊是不夠的,如果密碼足夠強,那麼攻擊者將無法從雜湊中找到密碼。在實踐中,攻擊者可能知道雜湊但不知道密碼的原因是攻擊者設法從伺服器中提取密碼雜湊數據庫,可能來自未受保護的備份或通過伺服器上的漏洞。網站上的此類漏洞經常成為新聞。

您提出的協議不如標準協議好。不要推出自己的加密貨幣!

是的。密碼通過加密連接發送,但它以明文形式發送到遠端伺服器。

驗證的常用方法是讓伺服器計算密碼的雜湊值並將其與保存在伺服器上的值進行比較。有幾種保存雜湊的方法,在目前的實現中,客戶端不知道伺服器使用什麼。(參見例如crypt手冊頁)。(即使確實如此,只需發送密碼的雜湊值,無論如何都會使雜湊值與密碼等效。)

此外,如果伺服器使用 PAM,則 PAM 模組可能會使用幾乎任何方法實現身份驗證,其中一些可能需要明文形式的密碼。

但是,使用公鑰的身份驗證不會將密鑰發送到遠端主機。(有關 security.SE 的問題中的一些解釋和連結)

還有一些基於密碼的身份驗證算法,如SRP,不需要以純文字形式將密碼發送到另一端。儘管 SRP 似乎僅作為外部更新檔針對 OpenSSH 實施。

引用自:https://unix.stackexchange.com/questions/297847