# 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公鑰加密密碼
```