有用過 ssh 的人應該都知道 ssh 是個遠端連線的工具,但 ssh 的背後是怎麼做到安全的連線呢?
在 ssh 之前 telnet, rsh 等工具會將訊息直接傳送(未加密),如果這時候有個壞人在竊聽你所傳送的東西,那你的東西就會被看光光,所以 ssh 所傳送的東西是加密過的密文,就算壞人拿到了也無法解密。
所以所以,ssh 應該要可以做到以下幾件事
比較簡單的 對稱式加密 加密和解密使用了同樣的 key,所以在 server 最一開始將 key 給 client 時如果被壞人竊取 key,那壞人就能夠把密文解密。
那要怎麼樣確保只有 server 能解密呢? 這時候就有請非對稱式加密~
非對稱式加密會有兩個為一組的 key(這裡先簡稱 A, 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
目前還缺少一件事,我們 server 還沒認證 client 的身分,最常見的方法是使用密碼登入,但 SSH 也支援 SSH Key 登入。
client 會產生一組 public key, private key,把 public key 給 server,當 server 要驗證 client 的身分時會給 client 一段隨機字串,這時候 client 用 private key 加密(簽名) 並回傳給 server,server 就可以用 **public key 解密(驗證簽名)**來確認 client 的身分。
相信大家也都有把 ssh key 提交到 github 的經驗,希望看到這裡的大家會知道為什麼要提交 ssh key,不知道的話就再幫大家複習一下囉~
GitHub 就是我們的 server(recipient),而我們執行 git push
的電腦就是 client(sender)。GitHub 要怎麼知道此電腦擁有 push 的權限呢?那就是透過 SSH Key 來驗證 client 的身分。
流程如下:
git push
時,client 用 private key 簽名,GitHub 用對應的 public key 驗證