SSH(Secure Shell)是一套協議標準,能夠用來實現兩臺機器之間的安全登陸以及安全的數據傳送,其保證數據安全的原理是非對稱加密。html
傳統的對稱加密使用的是一套祕鑰,數據的加密以及解密用的都是這一套祕鑰,可想而知全部的客戶端以及服務端都須要保存這套祕鑰,泄露的風險很高,而一旦祕鑰便泄露便保證不了數據安全。算法
非對稱加密解決的就是這個問題,它包含兩套祕鑰 - 公鑰
以及私鑰
,其中公鑰用來加密,私鑰用來解密,而且經過公鑰計算不出私鑰,所以私鑰謹慎保存在服務端,而公鑰能夠隨便傳遞,即便泄露也無風險。安全
保證SSH安全性的方法,簡單來講就是客戶端和服務端各自生成一套私鑰和公鑰,而且互相交換公鑰,這樣每一條發出的數據均可以用對方的公鑰來加密,對方收到後再用本身的私鑰來解密。服務器
由上一張圖能夠看出來,兩臺機器除了各自的一套公、私鑰以外,還保存了對方的公鑰,所以必然存在一個交換各自公鑰的步驟。實際上並非簡單的各自發送公鑰,而是存在一些專門的算法。這一步在首次連接時、數據傳送以前發生。併發
這裏有一個有趣的地方,兩臺機器第一次使用SSH連接時,當服務端返回本身的公鑰(第2步)的時候,客戶端會有一條信息提示,大意是沒法驗證對方是否可信,並給出對方公鑰的MD5編碼值,問是否肯定要創建連接。ssh
這是由於SSH雖然傳輸過程當中很安全,可是在首次創建連接時並無辦法知道發來的公鑰是否真的來自本身請求的服務器,若是有人在客戶端請求服務器後攔截了請求,並返回本身的公鑰冒充服務器,這時候若是連接創建,那麼全部的數據就都能被攻擊者用本身的私鑰解密了。這也就是所謂的中間人攻擊。編碼
SSH還經常使用來遠程登陸到別的機器,有兩種經常使用的方法,第一種即是帳號密碼登陸。加密
有些時候並非開發者手動去鏈接服務器,而是客戶端的程序須要鏈接到服務器,這時候用密碼登陸就比較不方便,一是須要處理輸入密碼的問題,二是須要想辦法安全的儲存密碼到程序裏,這種狀況下即可以利用公鑰來進行無密碼登陸。3d
利用公鑰登陸的關鍵是必須手動將客戶端的公鑰添加到服務端,好比GitHub便有這一步驟,添加了以後即可無密碼登陸。code
參考文獻: