ssh公鑰認證的原理

所謂的公鑰認證,實際上是使用一對加密字串,一個稱為公鑰(public key),任何人都可以看到其內容,用於加密;另一個稱為私鑰(private key),只有擁有者才能看到,用於解密。通過公鑰加密過的密文使用私鑰可以輕鬆解密,但根據公鑰來猜測私鑰卻十分困難。
ssh 的公鑰認證就是使用了這一特性。伺服器和客戶端都各自擁有自己的公鑰和私鑰。為了說明方便,以下將使用這些符號。
Ac:客戶端公鑰
Bc:客戶端私鑰
As:伺服器公鑰
Bs:伺服器私鑰
在認證之前,客戶端需要將公鑰 Ac 放到伺服器上。
認證過程分為兩個步驟。

  1. 會話金鑰(session key)生成
    a.客戶端請求連線伺服器,伺服器將 As 傳送給客戶端。
    b.伺服器生成會話ID(session id),設為 p,傳送給客戶端。
    c.客戶端生成會話金鑰(session key),設為 q,並計算 r = p xor q。
    d.客戶端將 r 用 As 進行加密,結果傳送給伺服器。
    e.伺服器用 Bs 進行解密,獲得 r。
    f.伺服器進行 r xor p 的運算,獲得 q。
    至此伺服器和客戶端都知道了會話金鑰q,以後的傳輸都將被 q 加密。
  2. 認證
    a.伺服器生成隨機數 x,並用 Ac 加密後生成結果 S(x),傳送給客戶端
    b.客戶端使用 Bc 解密 S(x) 得到 x
    c.客戶端計算 q + x 的 md5 值 n(q+x),q為上一步得到的會話金鑰
    d.伺服器計算 q + x 的 md5 值 m(q+x)
    e.客戶端將 n(q+x) 傳送給伺服器
    f.伺服器比較 m(q+x) 和 n(q+x),兩者相同則認證成功。

這個是一個比較詳細認證過程,包括了會話金鑰的生成。網路上大部分圖片只涵蓋了認證的過程,如下圖,可以照著圖簡單作以說明:
網路圖片,侵刪
圖中步驟1,2 涵蓋了前提條件(生成金鑰對並存儲在伺服器上)
圖中步驟3對應1a中客戶端請求連線伺服器
圖中步驟4,5對應2a伺服器生成隨機數 x,並用 Ac 加密後生成結果 S(x),傳送給客戶端
圖中步驟6對應2b客戶端使用 Bc 解密 S(x) 得到 x
圖中步驟7對應2c,2e,因為圖片中沒有生成會話金鑰或者簡略該步可以理解q=0。
圖中步驟8對應2d,2f比對一致則認證成功。

以上是作者翻閱網路資料得出的結論,或許有不準確的地方,可做參考理解,如有錯誤還請留言指正。

參考連結:http://blog.csdn.net/cnbird2008/article/details/8038926