SSH原理及兩種登錄方法圖文詳解
SSH(Secure Shell)是一套協(xié)議標(biāo)準(zhǔn),可以用來實(shí)現(xiàn)兩臺(tái)機(jī)器之間的安全登錄以及安全的數(shù)據(jù)傳送,其保證數(shù)據(jù)安全的原理是非對(duì)稱加密。
傳統(tǒng)的對(duì)稱加密使用的是一套秘鑰,數(shù)據(jù)的加密以及解密用的都是這一套秘鑰,可想而知所有的客戶端以及服務(wù)端都需要保存這套秘鑰,泄露的風(fēng)險(xiǎn)很高,而一旦秘鑰便泄露便保證不了數(shù)據(jù)安全。
非對(duì)稱加密解決的就是這個(gè)問題,它包含兩套秘鑰 - 公鑰以及私鑰,其中公鑰用來加密,私鑰用來解密,并且通過公鑰計(jì)算不出私鑰,因此私鑰謹(jǐn)慎保存在服務(wù)端,而公鑰可以隨便傳遞,即使泄露也無風(fēng)險(xiǎn)。
保證SSH安全性的方法,簡(jiǎn)單來說就是客戶端和服務(wù)端各自生成一套私鑰和公鑰,并且互相交換公鑰,這樣每一條發(fā)出的數(shù)據(jù)都可以用對(duì)方的公鑰來加密,對(duì)方收到后再用自己的私鑰來解密。

鏈接創(chuàng)建
由上一張圖可以看出來,兩臺(tái)機(jī)器除了各自的一套公、私鑰之外,還保存了對(duì)方的公鑰,因此必然存在一個(gè)交換各自公鑰的步驟。實(shí)際上并不是簡(jiǎn)單的各自發(fā)送公鑰,而是存在一些專門的算法。這一步在首次鏈接時(shí)、數(shù)據(jù)傳送之前發(fā)生。

客戶端發(fā)起鏈接請(qǐng)求服務(wù)端返回自己的公鑰,以及一個(gè)會(huì)話ID(這一步客戶端得到服務(wù)端公鑰)客戶端生成密鑰對(duì)客戶端用自己的公鑰異或會(huì)話ID,計(jì)算出一個(gè)值,并用服務(wù)端的公鑰加密客戶端發(fā)送加密后的值到服務(wù)端,服務(wù)端用私鑰解密服務(wù)端用解密后的值異或會(huì)話ID,計(jì)算出客戶端的公鑰(這一步服務(wù)端得到客戶端公鑰)至此,雙方各自持有三個(gè)秘鑰,分別為自己的一對(duì)公、私鑰,以及對(duì)方的公鑰,之后的所有通訊都會(huì)被加密
這里有一個(gè)有趣的地方,兩臺(tái)機(jī)器第一次使用SSH鏈接時(shí),當(dāng)服務(wù)端返回自己的公鑰(第2步)的時(shí)候,客戶端會(huì)有一條信息提示,大意是無法驗(yàn)證對(duì)方是否可信,并給出對(duì)方公鑰的MD5編碼值,問是否確定要建立鏈接。
這是因?yàn)镾SH雖然傳輸過程中很安全,但是在首次建立鏈接時(shí)并沒有辦法知道發(fā)來的公鑰是否真的來自自己請(qǐng)求的服務(wù)器,如果有人在客戶端請(qǐng)求服務(wù)器后攔截了請(qǐng)求,并返回自己的公鑰冒充服務(wù)器,這時(shí)候如果鏈接建立,那么所有的數(shù)據(jù)就都能被攻擊者用自己的私鑰解密了。這也就是所謂的中間人攻擊。

利用密碼登錄
SSH還常用來遠(yuǎn)程登錄到別的機(jī)器,有兩種常用的方法,第一種便是賬號(hào)密碼登錄。

- 服務(wù)端收到登錄請(qǐng)求后,首先互換秘鑰,詳細(xì)步驟如上一節(jié)所述。
- 客戶端用服務(wù)端的公鑰加密賬號(hào)密碼并發(fā)送
- 服務(wù)端用自己的秘鑰解密后得到賬號(hào)密碼,然后進(jìn)行驗(yàn)證
- 服務(wù)端用客戶端的公鑰加密驗(yàn)證結(jié)果并返回
- 服務(wù)端用自己的秘鑰解密后得到驗(yàn)證結(jié)果
利用公鑰登錄
有些時(shí)候并不是開發(fā)者手動(dòng)去連接服務(wù)器,而是客戶端的程序需要連接到服務(wù)器,這時(shí)候用密碼登錄就比較不方便,一是需要處理輸入密碼的問題,二是需要想辦法安全的儲(chǔ)存密碼到程序里,這種情況下便可以利用公鑰來進(jìn)行無密碼登錄。

客戶端用戶必須手動(dòng)地將自己的公鑰添加到服務(wù)器一個(gè)名叫authorized_keys的文件里,顧名思義,這個(gè)文件保存了所有可以遠(yuǎn)程登錄的機(jī)器的公鑰??蛻舳税l(fā)起登錄請(qǐng)求,并且發(fā)送一個(gè)自己公鑰的指紋(具有唯一性,但不是公鑰)服務(wù)端根據(jù)指紋檢測(cè)此公鑰是否保存在authorized_keys中若存在,服務(wù)端便生成一段隨機(jī)字符串,然后利用客戶端公鑰加密并返回客戶端收到后用自己的私鑰解密,再利用服務(wù)端公鑰加密后發(fā)回服務(wù)端收到后用自己的私鑰解密,如果為同一字符串,則驗(yàn)證通過
利用公鑰登錄的關(guān)鍵是必須手動(dòng)將客戶端的公鑰添加到服務(wù)端,比如GitHub便有這一步驟,添加了之后便可無密碼登錄。
參考文獻(xiàn):
總結(jié)
以上所述是小編給大家介紹的SSH原理及兩種登錄方法圖文詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
logback-spring.xml的配置及示例詳解(直接復(fù)制粘貼可用)
在使用logback作為日志框架時(shí),可以創(chuàng)建一個(gè)名為logback-spring.xml的配置文件來自定義日志輸出的格式和方式,下面這篇文章主要給大家介紹了關(guān)于logback-spring.xml的配置及示例詳解的相關(guān)資料,文中的代碼直接復(fù)制粘貼可用,需要的朋友可以參考下2024-01-01
springboot下實(shí)現(xiàn)RedisTemplate?List?清空
我們經(jīng)常會(huì)使用Redis的List數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)一系列的元素,當(dāng)我們需要清空一個(gè)List時(shí),可以使用RedisTemplate來實(shí)現(xiàn),本文就來詳細(xì)的介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下2024-01-01
使用Java實(shí)現(xiàn)Excel轉(zhuǎn)PDF的示例詳解
在實(shí)際的開發(fā)過程中,我們常常會(huì)遇到需要將 Excel 文件轉(zhuǎn)換為 PDF 文件的需求,本文為大家介紹一種Java中的常見實(shí)現(xiàn)方式,需要的可以參考一下2025-02-02
Spring?IOC容器Bean注解創(chuàng)建對(duì)象組件掃描
這篇文章主要為大家介紹了Spring?IOC容器Bean注解創(chuàng)建對(duì)象組件掃描,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Java Kafka 消費(fèi)積壓監(jiān)控的示例代碼
這篇文章主要介紹了Java Kafka 消費(fèi)積壓監(jiān)控,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
使用java反射將結(jié)果集封裝成為對(duì)象和對(duì)象集合操作
這篇文章主要介紹了使用java反射將結(jié)果集封裝成為對(duì)象和對(duì)象集合操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08
springboot jackson自定義序列化和反序列化實(shí)例
這篇文章主要介紹了spring boot jackson自定義序列化和反序列化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

