有用過 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
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.