通常,通過ssh登入遠端伺服器時,使用密碼認證,分別輸入使用者名稱和密碼,兩者滿足一定規則就可以登入。但是密碼認證有以下的缺點:

  • 使用者無法設定空密碼(即使系統允許空密碼,也會十分危險)
  • 密碼容易被人偷窺或猜到
  • 伺服器上的一個帳戶若要給多人使用,則必須讓所有使用者都知道密碼,導致密碼容易洩露,而且修改密碼時必須通知所有人

而使用公鑰認證則可以解決上述問題。

  • 公鑰認證允許使用空密碼,省去每次登入都需要輸入密碼的麻煩
  • 多個使用者可以通過各自的金鑰登入到系統上的同一個使用者

公鑰認證的原理

所謂的公鑰認證,實際上是使用一對加密字串,一個稱為公鑰(public key),任何人都可以看到其內容,用於加密;另一個稱為金鑰(private key),只有擁有者才能看到,用於解密。通過公鑰加密過的密文使用金鑰可以輕鬆解密,但根據公鑰來猜測金鑰卻十分困難。

ssh 的公鑰認證就是使用了這一特性。伺服器和客戶端都各自擁有自己的公鑰和金鑰。為了說明方便,以下將使用這些符號。

Ac 客戶端公鑰
Bc 客戶端金鑰
As 伺服器公鑰
Bs 伺服器金鑰

在認證之前,客戶端需要通過某種方法將公鑰 Ac 登入到伺服器上。

認證過程分為兩個步驟。

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

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智慧的隊伍中來!http://www.captainbed.net