SSH2協議加密與連接過程

最近在做ssh2聯動交換機模塊,看到libssh2-1.9.0版本對於用戶認證有三種不同的方式:

① password(默認)② keyboard-interactive ③ publickey

看代碼並不是太理解,所以查詢了一番,SSH2通信大致分爲兩步,以下是對通信過程的簡單理解:

生成共享祕鑰(加密通道):

1. 客戶端先向服務器發起TCP連接。

2. 服務器回覆自己所支持的SSH版本,若客戶端也支持,則繼續。

 3. 雙方協商一個公共的加密算法,最終使用的加密法一般由機器上加密法列表的排序決定:客戶端加密法列表上出現的第一個服務器端也支持的加密算法,將用於雙方加密傳輸的實現。

4. 採用Diffie-Hellman算法,生成共享祕鑰(這一塊是重點)

① 客戶端發起請求,服務器取兩個最大數P、G (公開的) ,其中P是一個素數,G是P的一個模p本原單位根(primitive root module p),P會通過之前協商的加密方式加密,發送給客戶端

客戶端C會生成一個不公開的隨機數a,計算CKey = G ^a mod P,加密後,將CKey發送給服務器。

③ 服務器S會生成一個不公開的隨機數b,計算SKey = G ^b mod P,加密後,將SKey發送給客戶端,同時發送的還有服務器的公鑰。

④ 客戶端C收到SKey後,計算共享祕鑰:K = SKey ^a mod P = G ^(b * a) mod P,同時驗證此公鑰是否存在自己的known_hosts文件中,若不存在或不一致,則會提示是否確認連接。

⑤ 服務器S收到CKey後,計算共享祕鑰:K = CKey ^b mod P = G ^(a * b) mod P。

用戶認證:

第一種方式:password

根據前一步生成的共享祕鑰,直接輸入用戶密碼進行驗證。(一般情況下,若沒有特殊指定其他認證方式,默認用此認式)

第二種方式:keyboard-interactive

這個方式是必須啓用鍵盤輸入纔可以,防止記住密碼後直接登錄。

第三種方式:publickey

1. 客戶端生成一對祕鑰:public/private key,並將公鑰放到服務器的 authorized_keys 文件中。

2. 客戶端發送一個祕鑰ID給服務器。

3. 服務器收到之後,會在authorized_keys 文件中查找是否有此ID的公鑰, 如果有,則服務器生成一個隨機數x,並用客戶端的公鑰加密後通過加密通道發送給客戶端。

4. 客戶端收到之後,用私鑰解除x,然後在本地爲隨機數x做MD5哈希,並通過加密通道發送給服務器。

5. 服務器爲隨機數x做MD5哈希,然後用共享祕鑰加密後與客戶端發送過來的數做比較,若一致,則認證通過。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

結語:

以上就是我對於SSH2通信的一個大致理解,若有錯處,望指出,大家共同進步,謝謝!

主要參考鏈接:

1. 加密連接過程:https://blog.csdn.net/zstack_org/article/details/53100545

2. Diffie-Hellman算法:https://www.zhihu.com/question/29383090/answer/70435297

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章