快(kuài)速了(le)解SSH的(de)工(gōng)作(zuò)原理₩©™(lǐ)
來(lái)源:創立工(gōng)作(zuò)室 Ω∏≥作(zuò)者:馮軍 發布時(shí)間(ji↕$ān):2020-07-19 14:19:46 閱讀(dú) 1÷♥™→218 次
熟悉Linux的(de)人(rén)肯定都(dōu)知÷¶(zhī)道(dào)SSH。SSH是(shì)一(yī)種用(yòn↑∞g)于安全訪問(wèn)遠(yuǎn)程服務器(qì)的(de)網絡協議≠≤ ©(yì)。它将客戶端與服務端之間(jiān)∞>¥≤的(de)消息通(tōng)過加密保護起來δ₹δ'(lái),這(zhè)樣就(jiù)無法被₹€&竊取或篡改了(le)。那(nà)麽它安全性是(shì)如(₽&rú)何實現(xiàn)的(de)呢(ne§₽ )?
為(wèi)了(le)理(lǐ)解SSH,先要(yàπαπ÷o)介紹兩個(gè)重要(yào)概念:對(duì)稱加密和(hé)非對(duì)稱加密。
對(duì)稱加密:
在對(duì)稱加密中,客戶端和(hé)服↑'務端使用(yòng)同一(yī)個(gè)密鑰對(duì☆•¶÷)數(shù)據進行(xíng)加密和(hé)解密。這(zhè)種方λ©'法的(de)好(hǎo)處是(shì)加密強度高↑™δ(gāo),很(hěn)難破解。缺點也(yě)很(hěn)明(míng♠↕♣←)顯,即密鑰本身(shēn)容易被洩漏。因此,如(rú)何保存密鑰成為(w₽©βèi)了(le)關鍵問(wèn)題。于是(sh₹δ∏γì)引出了(le)第二種加密方式:非對(duì)稱加密。
非對(duì)稱加密:
在非對(duì)稱加密中有(yǒu)兩個(gè)密鑰,公鑰和($©hé)私鑰。這(zhè)兩個(gè)密鑰配對(duì)産生(shēn↕™×g)和(hé)使用(yòng)。用(yòng)公鑰加密的(de)數(shù↓¥)據,必須用(yòng)與其對(duì)應的(de)私鑰才能(né¥₩×ng)解開(kāi)。并且,私鑰無法通(tō Ωng)過公鑰獲取。因此,公鑰是(shì)可©σ(kě)以被公開(kāi)的(de),而私鑰則必須被安全存放(fàn↑↔g)。
在SSH中,非對(duì)稱加密被用(yòng)來(lái)在會(huì↑↔)話(huà)初始化(huà)階段為(wèi)通(tōng)信雙方進行(₩☆ε≠xíng)會(huì)話(huà)密鑰的(de)協商。由π"σ$于非對(duì)稱加密的(de)計(jì)算(suàn)量開(kāi →)銷比較大(dà),因此一(yī)旦雙方的(de)÷會(huì)話(huà)密鑰協商完成,後續的(de)加密Ω₽§都(dōu)将采用(yòng)對(duì)稱加密₹φ <來(lái)進行(xíng)。
接下(xià)來(lái),我們來(lái)看(kàn)一("•yī)看(kàn)SSH會(huì)話(huà)建立的(de)過程。§σ
1. 客戶端發起一(yī)個(gè)TCP連接,默&★×認端口号為(wèi)22.
2. 服務端收到(dào)連接請(qǐng)求後,λ£₩将自(zì)己的(de)一(yī)些(xiē)關鍵信息♠"¥發給客戶端。這(zhè)些(xiē)信息包括:
- 服務端的(de)公鑰:客戶端在收到(dào)₽ 這(zhè)個(gè)公鑰後,會(huì)在自(zì)己的(deα✘)“known_hosts”文(wén)件(jiàn)進行(xíng)×&搜索。如(rú)果找到(dào)了(le)相(xiàng)同的(®↓ de)公鑰,則說(shuō)明(míng)此前連接過該 ε±服務器(qì)。如(rú)果沒有(yǒu)₩↔找到(dào),則會(huì)在終端上(shàng)顯示一(y★®ī)段警告信息,由用(yòng)戶來(lái₩ "₽)決定是(shì)否繼續連接。
coderunner@geekyshacklebol&t:~$ ssh geekyshacklebolt
The authenticity ≥¶≤of host 'geekyshacklebolt (192.168γα.42.222)' can't be established.
ECDSA key finge↓$♠rprint is SHA256:Ql/KnGl®δφolY9eCGuYK3OX3opnSyJQz® sbtM3DW/UZIxms.
Are you sure yo ∑u want to continue con 'necting (yes/no)?
- 服務器(qì)所支持的(de)加密算(suàn)法列表:客戶端根¶$據此列表來(lái)決定采用(yòng)哪種加密算(su£₽♦àn)法。
3. 生(shēng)成會(huì)話(huà)密鑰。此時(shí),客®>₩戶端已經擁有(yǒu)了(le)服務端的(de)公鑰。接下(xiΩà)來(lái),客戶端和(hé)服務端需±♠✘要(yào)協商出一(yī)個(gè)雙方都(d>•∏ōu)認可(kě)的(de)密鑰,并以此來(lái)對(duì)雙方後¥₩" 續的(de)通(tōng)信內(nèi)容進行(xíng)加密。
密鑰協商是(shì)通(tōng)過Diffie - H€ δ★ellman算(suàn)法來(lái)實現π↑™ (xiàn)的(de)。具體(tǐ)過程是(s♣♥ hì):
1)服務端和(hé)客戶端共同選定一(yī)個(gè)大(dà)素數$(shù),叫做(zuò)種子(zǐ)值;∑•σ
2)服務端和(hé)客戶端各自(zì)獨立地(dì)選擇<>φ另外(wài)一(yī)個(gè)隻有(yǒu)自(zì£☆)己才知(zhī)道(dào)的(de)素數(shù);
3)雙方使用(yòng)相(xiàng)同的(de)$&©加密算(suàn)法(如(rú)AES),由種子(zǐ)值和(hφ&©é)各自(zì)的(de)私有(yǒu)素數(shù)生(shēng)成§ €✔一(yī)個(gè)密鑰值,并将這(zhè)個(gè)值發送給對(γ₽duì)方;
4)在收到(dào)密鑰值後,服務端和(hé)客戶端根據種子(☆≈zǐ)值和(hé)自(zì)己的(de)私有(yǒu)'¥δ素數(shù),計(jì)算(suàn)出一(yī)>∑✔個(gè)最終的(de)密鑰。這(zhè)一$•(yī)步由雙方分(fēn)别獨立進行(xíng),但(dγ•βàn)是(shì)得(de)到(dào)的(de)結果$πβ應該是(shì)相(xiàng)同的(de)。
5)雙方使用(yòng)上(shàng)一(yī)步得(de)到(d↑≤ào)的(de)結果作(zuò)為(wè≥₹≈γi)密鑰來(lái)加密和(hé)解密通(tōng)信內(nèi)容。
4. 接下(xià)來(lái),客戶端将自(zì)λ 己的(de)公鑰id發送給服務端,服務端需要(yào)對(duì)客戶端€ ✔的(de)合法性進行(xíng)驗證:
1)服務端在自(zì)己的(de)“authorized_keys”文(wén✔★)件(jiàn)中搜索與客戶端匹配的(de)公鑰。
2)如(rú)果找到(dào)了(le),服務端用(y♣>πòng)這(zhè)個(gè)公鑰加密一(yī)個(g&♠è)随機(jī)數(shù),并把加密後的(de)結果發送給§∏↑客戶端。
3)如(rú)果客戶端持有(yǒu)正确的(de)私鑰,那 ☆(nà)麽它就(jiù)可(kě)以對(duì)消息進行(xíng)解密從(αγcóng)而獲得(de)這(zhè)個(gè)随機(jī)®£>數(shù)。
4)客戶端由這(zhè)個(gè)随機(jī)數(shù)和(h¥•é)當前的(de)會(huì)話(huà)密鑰共同生(shēng)成一(↕ ♣yī)個(gè)MD5值。
5)客戶端把MD5值發給服務端。
6)服務端同樣用(yòng)會(huì)話(huà)密鑰和(>hé)原始的(de)随機(jī)數(shù)計 ∑≥(jì)算(suàn)MD5值,并與客戶端發過來(lái)的(de)值↔≠₽進行(xíng)對(duì)比。如(rú)果相(xiàng$$)等,則驗證通(tōng)過。
至此,通(tōng)信雙方完成了(le)加密信道( ∑✘dào)的(de)建立,可(kě)以開(kāi)始正常的₩σ ε(de)通(tōng)信了(le)。
總結:
SSH巧妙地(dì)利用(yòng)了(le±λ₩α)對(duì)稱加密與非對(duì)稱加密各自(z✔π≈←ì)的(de)特點,實現(xiàn)了(✔δ$le)一(yī)套安全保密的(de)遠(yuǎn)程✔®σ控制(zhì)協議(yì)。
- 上(shàng)一(yī)篇:2020最新整理(lǐ)PHP面試題附答(dá)案
- 下(xià)一(yī)篇:帝國(guó)cms靈動标簽調用(yòng)指定id文(wén ₽$)章(zhāng)以及多(duō)個(gè)欄目文(wén)章(zhā€≥πng)