什么是ssh
ssh是一個標準協議,用于保證網絡通信安全服務,也就是加密,常見的應用場景就是安全登錄,這個大家常用git的話應該比較熟悉,配置ssh后就可以不需要密碼直接登錄了,非常方便,那么ssh是怎樣保證安全的呢。
ssh加密
加密是我們保證通信鏈路安全的最重要的方式,包括軍用情報的傳輸,全部是由復雜的加密算法加持的,就是為了保證只有對的人才能讀出正確的信息,林俊杰的歌詞完美的說明了這個問題
確認過眼神,我遇上對的人。
對稱加密

客戶端對稱加密過程

服務端對稱加密過程
對稱加密就是通信雙方使用同樣的密鑰來加密數據,但是這樣一來風險就比較大,客戶端的數量都非常大,一旦任一客戶端的密鑰被泄露都會導致整個系統的數據傳輸被暴露,事情就大條了。那么解決這個問題的方式就是非對稱加密。
非對稱加密
非對稱加密使用一個公鑰和一個私鑰來加密和解密數據,使用公鑰加密的數據只能用對應的私鑰解密,而且只有公鑰是無法計算或者猜測出私鑰的。

以一次登錄為例,非對稱加密的基本流程如下,
0、客戶端發起明文登錄請求
1、服務端將公鑰發送給客戶端
2、客戶端使用公鑰加密登錄的賬號密碼等敏感數據
3、加密后的數據發送給服務端
4、服務端獲取數據后,使用對應的私鑰解密
5、校驗數據合法性
6、返回登錄結果
看起來很完美,萬無一失?NO!NO!NO!
中間人攻擊
設想一下如下場景,有黑客大神搭建了一個假冒的服務器,攔截了你的明文請求,然后把自己的公鑰發送給你,你傻乎乎的使用了這個公鑰,然后把加密后的數據發送給了假冒的服務器,假冒的服務器下一步的動作當然是毫不客氣的使用私鑰解密你的數據,然后獲取到了你的明文密碼,換句話說,你的賬號被盜了!

中間人攻擊示意
如何防范中間人攻擊呢?這就需要基于口令的認證,SSH的公鑰和私鑰都是自己生成的,沒法公證。只能通過客戶端自己對公鑰進行確認。通常在第一次登錄的時候,系統會出現下面提示信息
The authenticity of host 'ssh-server.example.com (12.18.429.21)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
需要我們自行確認服務端的RSA指紋,輸入yes后提示
Warning: Permanently added 'ssh-server.example.com,12.18.429.21' (RSA) to the list of known hosts.
Password: (enter password)
接下來就是按照我們上述的流程走了。