最近被人問起了ssh key 認證的過程這個問題,之前我一直以為自己是知道的,不就是把client的PUB key加入到server的authorized_keys文件中么,感覺So easy!但是真回答的時候,就啞火了。So,我決定補上這一課。
以下內容參考互聯網文章
概念
公鑰(public key): 一般用來加密
私鑰(private key):一般用來解密
為什么用“一般”,是因為公鑰在某些情況也可以用來解密的,比如數字證書,以后再詳談。。。認證過程
假設:
Ac 代表 客戶端公鑰
Bc 代表 客戶端密鑰
As 代表 服務器公鑰
Bs 代表 服務器密鑰
-
會話密鑰(session key)生成
- 客戶端請求連接服務器,服務器將 As 發送給客戶端。
- 服務器生成會話ID(session id),設為 p,發送給客戶端。
- 客戶端生成會話密鑰(session key),設為 q,并計算 r = p xor q。
- 客戶端將 r 用 As 進行加密,結果發送給服務器。
- 服務器用 Bs 進行解密,獲得 r。
- 服務器進行 r xor p 的運算,獲得 q。
- 至此服務器和客戶端都知道了會話密鑰q,以后的傳輸都將被 q 加密。
-
認證
- 服務器生成隨機數 x,并用 Ac 加密后生成結果 S(x),發送給客戶端。
- 客戶端使用 Bc 解密 S(x) 得到 x 。
- 客戶端計算 q + x 的 md5 值 n(q+x),q為上一步得到的會話密鑰。
- 服務器計算 q + x 的 md5 值 m(q+x)。
- 客戶端將 n(q+x) 發送給服務器。
- 服務器比較 m(q+x) 和 n(q+x),兩者相同則認證成功。