天天都在用 SSH,你知道 SSH 的原理嗎?

做者:LeanCloud 工程師 毅然html

在我剛剛學習開發和某大佬溝通時,大佬說了一句話:把你的 SSH Key 給我。個人心裏是這樣的:算法

想問什麼是 SSH,又不敢問安全

打開 Google 以後大體明白了 SSH 是一種安全協議,因而先把 Key 梭出來幹活,但以後的一段時間對 SSH 只停留在使用階段上,只知道有 Public Key 和 Private Key 這個機制,具體它是如何保證安全的,卻模模糊糊不清楚。服務器

每當使用 SSH 的時候我都在想:SSH 究竟是如何保證安全的呢?既然 Public Key 加密的內容只有 Private Key 能解密,那客戶端發給服務端的消息怎麼解密呢?最重要的是,萬一被人問倒了豈不是做爲工程師的面子都沒了?ide

如今就讓咱們一塊兒開心地聊一聊 SSH 究竟是怎麼運做的。先拋開你們常常講的 Public/Private Key,咱們從其餘角度來看看 SSH。SSH 的鏈接分爲兩步:學習

  • 客戶端和服務端創建鏈接
  • 用戶身份鑑權

客戶端和服務端創建鏈接

在這一大步中,又分爲如下幾小步:ui

  1. 客戶端聯繫服務端,雙方溝通本身支持的 SSH 協議的版本,約定使用某個共同支持的版本。
  2. 服務端將本身的 Host Key 、加密方法和其餘一些參數發給客戶端。
  3. 客戶端經過 Host Key 驗證服務端身份,雙方用服務端發來的參數和 Diffie-Hellman 算法生成 Session Key。
  4. 加密通道創建完成。

在這幾步中,出現了兩個 Key:Host Key 和 SessionKey。加密

Host Key 分爲 Public 和 Private 兩種。服務端擁有 Public Key 和 Private Key,並將 Public Key 發送給客戶端。客戶端用 Public Host Key 驗證這臺服務器確實是本身要鏈接的服務器後,雙方使用 Diffie-Hellman 算法生成一致的 SessionKey。spa

Host Key 由 SSH 自行生成,不須要用戶作什麼。若是客戶端經過 Host Key 發現歷來沒有鏈接過這臺服務器,會詢問用戶是否要繼續鏈接,用戶回答 yes 以後會在本地的 known_hosts 文件記錄這臺服務器,下次鏈接時客戶端就不會再次詢問。因爲僅靠服務端下發 Host Key 的方法沒法防範中間人攻擊,後來又出現了 Public Key Certificates,由一個可靠的第三方機構給服務端簽發證書,從而確保了安全性。htm

Session Key 用於以後通信時對消息進行加密解密。這個 Session Key 的機制被稱做對稱加密(Symmetric Encryption),也就是兩端使用的相同的 Key 來加密和解密信息。能夠看出 SSH 信息的加密解密時並非用你們本身生成的 Public/ Private Key,而是用雙方都一致的 Session Key。

生成 Session Key 的步驟大體以下:

(圖片來源:維基百科

  1. 客戶端和服務端使用溝通時的信息,協商加密算法以及一個雙方都知道的數字。
  2. 雙方各自生成只有本身才知道的 private 密碼,並使用上一步中的數字進行加密,再次生成密碼。
  3. 雙方交換再次加密後的密碼。
  4. 雙方在對方發來的密碼基礎上,加上第二步本身的 private 密碼再次加密。本次加密以後獲得的結果就是在雙方處都相同的 Session Key。

從這個算法中,能夠看出客戶端和服務端沒有直接傳輸本身在第二步生成的密碼,而是經過加密互換再加密的方式來生成 Session Key,從而保障了 Session Key 沒法被泄露。

用戶身份鑑權

當客戶端和服務端之間創建起加密連接後,進入到身份鑑權的步驟。在身份鑑權這一步除了使用 Key 登陸外,還能使用密碼登陸,這裏咱們只講 Key 方式的登陸。

工做中咱們在客戶端生成的 Public/Private Key,就是指用來身份鑑權的 Authorized Key。客戶端擁有 Private 和 Public Key,提早將 Public Key 放到服務端用於登陸。登陸時的具體步驟以下:

  1. 客戶端用 Private Key 生成簽名向服務器發起登陸請求。
  2. 服務端驗證簽名,檢查本身有沒有和這個簽名匹配的 Public Key,若是有,則進入下一步。
  3. 服務端生成一串隨機字符串,用 Public Key 加密後發送給客戶端。
  4. 客戶端用相應的 Private Key 解密這串字符串,再使用 MD5 hash 和 Session Key 加密該字符串,將結果發送給服務端。
  5. 服務端使用一樣的 MD5 hash 和 Session Key 計算這串字符的加密結果,並和客戶端發來的結果作比對,若是結果同樣,則容許客戶端登陸。

Public/Private Key 的加密方式被稱做不對稱加密(Asymmetry Encryption),就是說使用不一樣的 Key 來對信息進行加密解密。客戶端使用 Private Key 能夠解密服務端使用 Public Key 加密的信息,服務端使用 Public Key 沒法解密客戶端使用 Private Key 發來的加密信息。登陸完成後,Authorized Key 的任務也就完成了。

SSH 完成鏈接,在接下來的通信過程當中,雙方將持續使用 Session Key 進行通信。

總結

SSH 分爲兩大步,第一步是客戶端和服務端創建鏈接,最終生成雙方都一致的 Session Key。第二步使用 Authorized Key 進行登陸,登陸過程使用 Public/Private Key 驗證身份。鏈接創建完成後,在通信過程當中使用 Session Key 對信息進行加密解密。

參考資料

相關文章
相關標籤/搜索