# SSH加密過程 SSH連線主要有:密鑰協商、身分驗證、加密通訊三個階段 會使用到對稱與非對稱加密 ## 登入方法1:密碼登入法 ```sequence Client -> Server: 發起連線 Server -> Client: 回覆伺服器支援的SSH版本\n以挑選對稱加密種類 Note over Client,Server: D-H密鑰協商 Server -> Client: 發送Server公鑰 Client -> Server: 使用公鑰加密登入密碼並發送 Note over Client,Server: 身分驗證成功之後\n使用協商的加密方法與密鑰進行通訊 ``` ## 登入方法2:公鑰(免密)登入 Clinet必須先生成公私鑰對,並將公鑰放到Server上(也就是需要先用密碼登入一次) ```sequence Client -> Server: 連線 Server -> Client: 回覆伺服器支援的SSH版本\n以挑選對稱加密種類 Note over Client,Server: D-H密鑰協商 Client -> Server: 通知存放公鑰的ID Note right of Server: 取得公鑰\n~/.ssh/authorized_keys Server -> Client: 加密一隨機字串並發送 Note left of Client: 用私鑰將字串解密\n並用MD5取出文字摘要 Client -> Server: 回傳摘要 Note right of Server: 比對是不是跟自己算的摘要相同 Note over Client,Server: 身分驗證成功之後\n使用協商的加密方法與密鑰進行通訊 ``` ## 密鑰協商:Diffie-Hellman算法 其中A^b mod P 與 B^a mod P 結果應相等 ```sequence Note left of Client: 取一個大質數P\n挑選P的一個原根G\n生成小於P的隨機數a\n計算G^a mod P = A Client -> Server: 傳送A、G、P Note right of Server: 算出Key= A^b mod P Note right of Server: 生成小於P的隨機數b\n計算G^b mod P = B Server -> Client: 傳送B Note left of Client: 算出Key= B^a mod P ``` ## 中間人攻擊 Client取得公鑰後,發現本地的~/.ssh/known_hosts,裡沒有這把公鑰的使用紀錄,會出現訊息 `The authenticity of host '[host]:port' can't be established.` 告知沒有方法確認伺服器公鑰真實性(SSH公鑰不會有CA簽發) 公鑰若是攻擊者的,通訊過程對攻擊者而言都會是可見的 (密鑰交換過程也同理) ```sequence Client -> Attacker: 發起連線 Attacker -> Server: 發起連線 Server -> Attacker: 發送Server公鑰 Attacker -> Client: 發送Attacker公鑰 Client -> Attacker: 使用Attacker公鑰加密登入密碼並發送 Attacker -> Server: Server公鑰加密密碼 ```