一、背景介紹
博主最近將自己寫的一些代碼上傳到Github,在配置Github的環境時對其SSH認證原理甚是疑惑,因此進行了一番瞭解,並記錄於此。
二、SSH簡介
簡單說,SSH(Secure Shell)是一種非對稱式加密與對稱式加密演算法相結合的安全網路通訊協定,用於電腦通訊加密。一個SSH會話的建立過程分為兩個階段:第一階段,雙方溝通並同意建立一個加密串連通道以供後續資訊傳輸用;第二階段,對請求接入的使用者進行身分識別驗證以確定伺服器端是否要給該使用者開放存取權限。
三、SSH工作原理
1.共同建立加密通道
使用SSH協議進行認證時,首先要建立一個加密通道,此加密通道是一個對稱式加密的過程,使用同一個密鑰進行加密與解密,那麼如何使伺服器與用戶端都能安全地獲得這個密鑰呢。
第一種方法是,首先服務端會通過非對稱式加密,產生一個公開金鑰和私密金鑰,在用戶端發起請求時,服務端將公開金鑰暴露給用戶端(這個公開金鑰可以被任意暴露),用戶端在擷取公開金鑰後,會先產生一個由256位隨機數字組成的工作階段金鑰(這裡稱為口令),用戶端通過公開金鑰將這個口令加密,發送給伺服器端,伺服器端通過私密金鑰進行解密,擷取到通訊口令,之後,用戶端和服務端的資訊傳遞,都通過這個口令進行對稱的加密。
由於第一種方法存在資料被竊的可能,因此就有安全性更高的第二種方法。第二種方法使用DH(Diffie-Hellman)金鑰交換演算法來產生加密通道的密鑰。假設有A、B兩方,A作為寄件者,B作為接收者,通過下面的幾個步驟就可以構建出一個只屬於雙方的密鑰口令:
1) 首先A、B雙方,在通訊前構建專屬於自己的金鑰組,假設分別是公開金鑰A,私密金鑰A,公開金鑰B,私密金鑰B;
2) A將自己的公開金鑰A暴露給B,B通過私密金鑰B和公開金鑰A經過一定的運算產生出本地的密鑰B;
3) 同樣,B將自己的公開金鑰B暴露給A,A通過私密金鑰A和公開金鑰B經過一定的運算產生出本地的密鑰A;
4)最後,這個演算法有意思的一點就是,密鑰A和密鑰B是一致的,這樣A、B雙方就擁有了一個屬於雙方的“秘密”口令。
2.使用者認證及許可權開放
會話加密通道建立後,SSH開始進入使用者認證階段,以登陸遠程計演算法。認證方式有兩種,第一種是“密碼認證”,第二種是“公開金鑰認證”。
1) 密碼認證
在建立了加密通道後,伺服器要求用戶端輸入密碼,用戶端輸入的密碼經過上述的通道加密傳輸給伺服器。
2) 公開金鑰認證
SSH金鑰組的驗證過程起始於上一部分加密通道建立之後,其具體執行步驟如下:用戶端發送自己的密鑰ID給伺服器端伺服器在自己的authorized_keys檔案中檢查是否有此ID的公開金鑰如果有,則伺服器產生一個隨機數,用該公開金鑰加密之伺服器將加密後的隨機數發給用戶端用戶端用私密金鑰解密該隨機數,然後在本地為隨機數做MD5雜湊用戶端將該MD5雜湊發給伺服器端伺服器端為一開始自己產生的隨機數也做一個MD5雜湊,然後用通訊通道“公用的密鑰”將該雜湊加密,再跟用戶端發來的內容進行對比。如果雙方內容一致,則通過驗證,開放存取權限給用戶端
簡單來說,伺服器端用公開金鑰加密資訊,用戶端用私密金鑰解密資訊以證明自己持有私密金鑰。
參考:
[1] 理解SSH的加密與串連過程
[2] SSH加密原理、RSA非對稱式加密演算法學習與理解
[3] 淺談遠程登入時,ssh的加密原理
[4] SSH加密登入協議
[5] ssh公開金鑰私密金鑰認證原理