做者: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
在這幾步中,出現了兩個 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 的步驟大體以下:
(圖片來源:維基百科)
從這個算法中,能夠看出客戶端和服務端沒有直接傳輸本身在第二步生成的密碼,而是經過加密互換再加密的方式來生成 Session Key,從而保障了 Session Key 沒法被泄露。
當客戶端和服務端之間創建起加密連接後,進入到身份鑑權的步驟。在身份鑑權這一步除了使用 Key 登陸外,還能使用密碼登陸,這裏咱們只講 Key 方式的登陸。
工做中咱們在客戶端生成的 Public/Private Key,就是指用來身份鑑權的 Authorized Key。客戶端擁有 Private 和 Public Key,提早將 Public 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 對信息進行加密解密。
參考資料