快(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ú) 119≥€₽8 次
熟悉Linux的(de)人(rén)肯定都(dōu)知(zhī)道(dào)SSH。SSH是(₩β∑shì)一(yī)種用(yòng)于安全訪問(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ē±∞↕ng)和(hé)使用(yòng)。用(yòng)公鑰加密的(de)數(shù&§↑)據,必須用(yòng)與其對(duì)應的(de)私鑰才能(néng)解開( γkāi)。并且,私鑰無法通(tōng)過公鑰獲取。因此,λ€'公鑰是(shì)可(kě)以被公開(kāi)的(de),而私♣↓¶鑰則必須被安全存放(fàng)。
在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)對(d>α∏uì)稱加密來(lái)進行(xíng)。
接下(xià)來(lái),我們來(lái)看(kàn)一(yī)看(kàn)SSH會(h₩®uì)話(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@geekysha™παcklebolt:~$ ssh geekyshacklebo£×lt
The authenticity of host 'geekyshacklebolt'±Ω← (192.168.42.222)' can't be established.
ECDSA key fingerprint is SHA2 ∑∏56:Ql/KnGlolY9eCGuYK3OX3opnSyJQzsbtM3D♦£♥W/UZIxms.
Are you sure you want to continue connecti©₽ng (yes/no)?
- 服務器(qì)所支持的(de)加密算(suàn)法列表:∞§客戶端根據此列表來(lái)決定采用(yòng)哪種加密算(s€'$εuà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 - Hellma₹÷n算(suàn)法來(lái)實現(xiàn)的(de)。具體(tǐ)過程是(shì):
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è)密鑰值,并将這(z€®hè)個(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)