SSH 爲 Secure Shell 的縮寫,由 IETF 的網絡小組(Network Working Group)所制定;SSH 爲創建在應用層基礎上的安全協議。其目的是實現安全遠程登陸以及其它安全網絡服務。算法
從客戶端來看,SSH提供兩種級別的安全驗證。一種是基於口令的安全驗證,另外一種是基於密鑰的安全驗證。分別看一下兩種驗證方式的過程。shell
1,客戶端向服務端發起登陸請求:ssh username@hostname
安全
2,服務端收到客戶端的請求後,把本身的公鑰發送給客戶端;(服務端的公鑰保存在/etc/ssh/*.pub裏面)網絡
3,當客戶端第一次收到該服務端發送過來的公鑰時,爲了防止中間人攻擊(發送公鑰的主機不是服務端,而是攔截了客戶端登陸請求的主機),客戶端主機會有系統提示:併發
The authenticity of host 'ssh-server.example.com (12.18.429.21)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
複製代碼
上面的信息說的是:沒法確認主機ssh-server.example.com(12.18.429.21)的真實性,不過知道它的公鑰指紋,是否繼續鏈接?之因此用fingerprint代替key,主要是key過於長(RSA算法生成的公鑰有1024位),很難直接比較。因此,對公鑰進行hash生成一個128位的指紋,這樣就方便比較了。ssh
若是輸入 yes 後,會出現以下信息:加密
Warning: Permanently added 'ssh-server.example.com,12.18.429.21' (RSA) to the list of known hosts.
Password: (enter password)
複製代碼
該host已被確認,並被追加到文件 known_hosts 中,而後就須要輸入密碼。(當 known_hosts 存儲了服務端的公鑰以後,客戶端後續鏈接該服務端就會比對存儲在 known_hosts 文件裏的公鑰,從而確認是否爲該服務端發來的公鑰)spa
4,客戶端輸入密碼,使用服務端發來的公鑰進行加密,發送給服務端;code
5,服務端收到客戶端的加密信息,使用本身的私鑰進行解密比對,比對正確就給客戶端響應。server
1,客戶端將本身的公鑰放到服務端的 authorized_keys 文件中;
2,客戶端向服務端發起登陸請求:ssh username@hostname
3,服務端收到客戶端的請求後,會在 authorized_keys 中匹配到客戶端的公鑰,並生成隨機數 R,用客戶端的公鑰對該隨機數進行加密,而後將加密信息發送到客戶端;
4,客戶端收到加密信息後用私鑰進行解密,獲得隨機數 R,而後對隨機數 R 和本次會話的 SessionKey 利用 md5 生成摘要 Digest1,發送給服務端;
5,服務端收到 Digest1 後,也會對隨機數 R 和 SessionKey 利用一樣的摘要算法生成 Digest2,而後對比 Digest1 和 Digest2 是否相同,完成認證過程。
公鑰和私鑰到底哪一個是用來加密,哪一個是用來解密的,是否能夠公鑰加密私鑰解密,同時也能夠私鑰加密公鑰解密呢?
首先要明確兩個問題:(1)既能夠公鑰加密私鑰解密,也能夠私鑰加密公鑰解密;(2)加密解密和簽名驗證是兩個不一樣的概念。
1, 先來講加密解密:須要同時使用公鑰和私鑰的加密算法是非對稱加密,最多見的即是RSA。
舉例說明非對稱加密:若是A想要給B祕密的發一條信息,只須要B建立一套公鑰(盒子)和私鑰(鑰匙),盒子能夠隨意分發,可是鑰匙只能B本身全部,當A想要給B發信息時,只須要把信息(紙條)經過B的公鑰加密(放入盒子裏鎖上),再由B用私鑰(鑰匙)進行解密(打開盒子),便可獲取A發送的信息。此時若是C想要截取信息,可是因爲沒有B的私鑰,C即便拿到了信息也沒法解密(只有盒子沒有鑰匙),從而保證了數據的安全性。 那麼B是否能夠經過私鑰加密信息,而後由A使用公鑰解密信息呢?從原理上講,是能夠的。 非對稱密鑰是能夠用於雙向加解密的。可是咱們爲何不這麼用呢,很好理解,由於所謂公鑰,是公開的,不僅A一我的擁有,所以雖然A可以正常讀取到信息,可是其餘人也能夠解密該條信息,從而沒法保證信息的安全性。可是簽名驗證就不一樣了。
2, 簽名驗證:用私鑰進行簽名,用公鑰進行驗證,從而保證信息來源是私鑰擁有者。
舉例說明:A想要讓B確認某條信息是由本身發出的,先將本身的公鑰發送給B,而後用本身的私鑰對信息進行簽名併發送給B(好比將字符串X用A的私鑰加密生成Y,將X和Y以及信息都發送給B),B收到信息後用A的公鑰對簽名進行驗證,用A的公鑰解密Y獲得Z,若是Z=X,則驗證成功,說明信息是由A發佈的。