有用過 ssh 的人應該都知道 ssh 是個遠端連線的工具,但 ssh 的背後是怎麼做到安全的連線呢? ## SSH 會幫我們把訊息加密 在 ssh 之前 telnet, rsh 等工具會將訊息直接傳送(未加密),如果這時候有個壞人在竊聽你所傳送的東西,那你的東西就會被看光光,所以 ssh 所傳送的東西是加密過的密文,就算壞人拿到了也無法解密。 所以所以,ssh 應該要可以做到以下幾件事 1. server 把加密用的 key 給 client 2. client 用 key 將訊息**加密**後傳給 server 3. 確保只有 server 能將訊息**解密** 比較簡單的 **對稱式加密** 加密和解密使用了同樣的 key,所以在 server 最一開始將 key 給 client 時如果被壞人竊取 key,那壞人就能夠把密文解密。 那要怎麼樣確保只有 server 能解密呢? 這時候就有請非對稱式加密~ ## 非對稱式加密 非對稱式加密會有兩個為一組的 key(這裡先簡稱 A, B key),且會有以下特點 1. 用 A key 加密後只能用 B key 解密 (用 A key 也無法解密) 2. 用 B key 加密後只能用 A key 解密 (用 B key 也無法解密) (設計出這個演算法的人真的好神) 回到剛剛的問題,server 產生一組 A, B key,並先將 **A key** 給 client,client 加密後 server 再用 **B key** 解密,這樣就能確保能解密的 B key 沒有外流過 (撒花~ A, B key 也有他們正式的名子,A key 因為可以公開給任何人,所以被稱為 **public key**,而 B key 則為 **private key** ## Client 身分認證 目前還缺少一件事,我們 server 還沒認證 client 的身分,最常見的方法是使用密碼登入,但 SSH 也支援 **SSH Key 登入**。 client 會產生一組 public key, private key,把 public key 給 server,當 server 要驗證 client 的身分時會給 client 一段隨機字串,這時候 client **用 private key 加密(簽名)** 並回傳給 server,server 就可以用 **public key 解密(驗證簽名)**來確認 client 的身分。 ## 圖解    ## Github 中的 SSH Key 相信大家也都有把 ssh key 提交到 github 的經驗,希望看到這裡的大家會知道為什麼要提交 ssh key,不知道的話就再幫大家複習一下囉~ GitHub 就是我們的 server(recipient),而我們執行 `git push` 的電腦就是 client(sender)。GitHub 要怎麼知道此電腦擁有 push 的權限呢?那就是透過 SSH Key 來驗證 client 的身分。 流程如下: 1. client 產生 SSH 金鑰 2. client 將 **public key** 提交到 GitHub 3. `git push` 時,client **用 private key 簽名**,GitHub **用對應的 public key 驗證** 4. 若驗證成功,即確認此 client 有權限操作該 GitHub Repository
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up