導航:首頁 > 文檔加密 > ssh公匙加密

ssh公匙加密

發布時間:2024-09-14 10:07:19

『壹』 SSH隧道協議(AES密鑰對加密法則)

SSH是每一台Linux電腦的標准配置

隨著Linux設備從電腦逐漸擴展到手機、外設和家用電器,SSH的適用范圍也越來越廣。不僅程序員離不開它,很多普通用戶也每天使用;SSH具備多種功能,可以用於很多場合。有些事情,沒有它就是辦不成

簡單說,SSH是一種網路協議,用於計算機之間的加密登錄。
如果一個用戶從本地計算機,使用SSH協議登錄另一台遠程計算機,我們就可以認為,這種登錄是安全的,即使被中途截獲,密碼也不會泄露。
最早的時候,互聯網通信都是明文通信,一旦被截獲,內容就暴露無疑。1995年,芬蘭學者Tatu Ylonen設計了SSH協議,將登錄信息全部加密,成為互聯網安全的一個基本解決方案,迅速在全世界獲得推廣,目前已經成為Linux系統的標准配置。雹和陵
需要指出的是,SSH只是一種協議,存在多種實現,既有商業實現,也有開源實現。

SSH主要用於遠程登錄。假定你要以用戶名user,登錄遠程主機host,只要一條簡單命令就可以了。

如果本地用戶名與遠程用戶名一致,登錄時可以省略用戶名。

SSH的默認埠是22,也就是說,你的登錄請求會送進遠程主機的22埠。使用p參數,可以修改這個埠。

上面這條命令表示,ssh直接連接遠程主機的2222埠。

SSH之所以能夠保證安全,原因在於它採用了公鑰加密。
整個過程是這樣的:(1)遠程主機收到用戶的登錄請求,把自己的公鑰發給用戶。(2)用戶使用這個公鑰,將登錄密碼加密後,發送回來。(3)遠程主機用自己的私鑰,解密登錄密碼,如果密碼正確,就同意用戶登錄。

這個過程本身是安全的,但是實施的時候存在一個風險:如果有人截獲了登錄請求,然後冒充遠程主機,將偽造的公鑰發給用戶,那麼用戶很難辨別真偽。因為不像https協議,SSH協議的公鑰是沒有證書中心棚褲(CA)公證的,也就是說,都是自己簽發的。

可以設想,如果攻擊者插在用戶與遠程主機之間(比如在公共的wifi區域),用偽造的公鑰,獲取用戶的登錄密碼。再用這個密碼登錄遠程主機,那麼SSH的安全機制就盪然無存了。這種風險就是著名的「中間人攻擊」(Man-in-the-middle attack)。

SSH協議是如何應對的呢?

如果你是第一次登錄對方主機,系統會出現下面的提示:

這段話的意思是,無法確認host主機的真實性,只知道它的公鑰指紋,問你還想繼續連接嗎?

所謂」公鑰指紋」,是指公鑰長度較長(這里採用RSA演算法,長達1024位),很難比對,所以對其進行MD5計算,將它變成一個128位的指紋。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再進行比較,就容易多了。

很自然的一個問題就是,用戶怎麼知道遠程主機的公鑰指紋應該是多少?回答是沒有好辦法,遠程主機必須在自己的網站上貼出公鑰指紋,以便用戶自行核對。

假定經過風險衡量以後,用戶決定接受這個遠程主機的公鑰。

系統會出現一句提示,表示host主機已經得到認可。

然後,會要求輸入密碼。

如果密碼正確,就可以登錄了。

當遠程主機的公鑰被接受以後,它就會被保存在文件 $HOME/.ssh/known_hosts 之中。下次再連接這台主機,系統就會認出它的公鑰已經保存在本地了,從而跳過警告部分,直接提示輸入密碼。

每個SSH用戶都有自己的 known_hosts 文件,此外系統也有一個這樣的文件,通常是 /etc/ssh/ssh_known_hosts ,保存一些對所有用戶都可信賴的遠程主機的公鑰。

使用密碼登錄,每次都必須輸入密碼,非常麻煩。好在SSH還提供了公鑰登錄,可以省去輸入密碼的步驟。

所謂」公鑰登錄」,原理很簡單,就是用戶將自己的公鑰儲存在遠程主機上。登錄的時候,遠程主機會向用戶發送一段隨機字元串,用戶用自己的私鑰加密後,再發回來。遠程主機用事先儲存的公鑰進行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。

這種方法要求用戶必須提供自己的公鑰。如果沒有現成的源戚,可以直接用 ssh-keygen 生成一個:

運行上面的命令以後,系統會出現一系列提示,可以一路回車。其中有一個問題是,要不要對私鑰設置口令(passphrase),如果擔心私鑰的安全,這里可以設置一個。

運行結束以後,在$HOME/.ssh/目錄下,會新生成兩個文件: id_rsa.pub 和 id_rsa 。前者是你的公鑰,後者是你的私鑰。

這時再輸入下面的命令,將公鑰傳送到遠程主機host上面:

好了,從此你再登錄,就不需要輸入密碼了。

如果還是不行,就打開遠程主機的 /etc/ssh/sshd_config 這個文件,檢查下面幾行前面」#」注釋是否取掉。

然後,重啟遠程主機的ssh服務。

遠程主機將用戶的公鑰,保存在登錄後的用戶主目錄的 $HOME/.ssh/authorized_keys 文件中。公鑰就是一段字元串,只要把它追加在 authorized_keys 文件的末尾就行了。

這里不使用上面的ssh--id命令,改用下面的命令,解釋公鑰的保存過程:

這條命令由多個語句組成,依次分解開來看:

(1) 」$ ssh user@host」 ,表示登錄遠程主機;

(2)單引號中的 mkdir .ssh && cat >> .ssh/authorized_keys ,表示登錄後在遠程shell上執行的命令:

(3) 」$ mkdir -p .ssh」 的作用是,如果用戶主目錄中的.ssh目錄不存在,就創建一個;

(4) 』cat >> .ssh/authorized_keys』 < ~/.ssh/id_rsa.pub 的作用是,將本地的公鑰文件 ~/.ssh/id_rsa.pub ,重定向追加到遠程文件 authorized_keys 的末尾。

寫入 authorized_keys 文件後,公鑰登錄的設置就完成了。

『貳』 SSH詳解-3.密鑰登陸

SSH詳解-1.ssh基礎知識
SSH詳解-2.ssh基本用法
SSH詳解-3.密鑰登陸
SSH詳解-4.多個ssh公鑰

在上一篇中我們了解到了ssh基本用法,ssh通過密碼進行登錄。密碼登錄存在很多問題。密碼太簡單,又不安全。密碼太復雜,不容易記,而且每次登錄都要輸入很麻煩。於是就有了密鑰登陸。

什麼是密鑰(key)?

ssh密鑰登錄採用的是 非對稱加密 。

非對稱密鑰加密系統,又稱公鑰密鑰加密。它需要使用不同的密鑰來分別完成加密和解密操作,一個公開發布,即公開密鑰(public key)和,另一個由用戶自己秘密保存,即私用密鑰(private key)。
如果數據使用公鑰加密,那麼只有使用對應的私鑰才能解密,其他密鑰都不行;反過來,如果使用私鑰加密(這個過程一般稱為「簽名」),也只有使用對應的公鑰解密。

了解完密鑰後,接下來看看密鑰登錄的過程,SSH 密鑰登錄分為以下的步驟。

第零步,准備步驟客戶端通過 ssh-keygen 生成自己的公鑰和私鑰,並將公鑰放入遠程伺服器的指定位置。

第一步,用戶客戶端向伺服器發起SSH登錄的請求。

第二步,伺服器收到用戶SSH登錄的請求,伺服器生成一些隨機數據發送給客戶端。

第三步,客戶端接收到伺服器發過來的數據,客戶端使用私鑰對數據進行簽名後再返回給伺服器。

第四步,伺服器收到客戶端加密後的數據,使用對應公鑰進行解密。然後判斷解密後的數據是否與原始數據一致,如果一致就允許用戶登錄。

ssh-keygen 是OpenSSH提供的一個命令行工具,用於生成密鑰登錄所需的公鑰和私鑰。

在上面的例子中,我使用了-t參數來指定加密演算法,一遍會選擇rsa或者dsa。
第一個問題,問我要保存在哪?(直接Enter默認會保存在~/.ssh/id_rsa中)因為我之前已經生成過密鑰了,我就保存在tenxun裡面。

第二個問題,詢問是否要為私鑰文件設定密碼保護(passphrase)。這樣的話,即使入侵者拿到私鑰,還是需要破解密碼。如果為了方便,不想設定密碼保護,可以直接按回車鍵,密碼就會為空。

最後,就會生成私鑰和公鑰,屏幕上還會給出公鑰的指紋,以及當前的用戶名和主機名作為注釋,用來識別密鑰的來源。

從上面的公鑰中我們可以看到末尾的公鑰注釋 23696@DESKTOP-GKRBCVI
公鑰注釋可以用來識別不同的公鑰,表示這是哪台主機(DESKTOP-GKRBCVI)的哪個用戶(username)的公鑰。

注意 ,公鑰只有一行。因為它太長了,顯示的時候可能自動換行了。

OpenSSH 規定,用戶公鑰保存在伺服器的 ~/.ssh/authorized_keys 文件。你要以哪個用戶的身份登錄到伺服器,密鑰就必須保存在該用戶主目錄的~/.ssh/authorized_keys文件。只要把公鑰添加到這個文件之中,就相當於公鑰上傳到伺服器了。每個公鑰占據一行。如果該文件不存在,可以手動創建。

-i 指定要上傳公鑰(公鑰文件可以不指定路徑和 .pub 後綴名),user是所要登錄的用戶名,hostname是主機名,這兩個參數與ssh 登錄命令是一致。

特別注意 ,不是把公鑰上傳上去就行了,還需要把 authorized_keys 文件的許可權要設為644,即只有文件所有者才能寫。如果許可權設置不對,SSH伺服器可能會拒絕讀取該文件,導緻密鑰登錄失效,登錄的時候還需要輸入密碼。

提到輸入密碼,如果再生成公鑰和私鑰的時候設置了密碼,使用密鑰登錄的時候也需要輸入私鑰的密碼,這樣可以防止他人非法竊取了私鑰。

私鑰設置了密碼以後,每次使用都必須輸入私鑰密碼,這個問題可以使用 ssh-agent 命令解決。

網路-密鑰
Git - 生成 SSH 公鑰 (git-scm.com)
ssh(1) - OpenBSD manual pages

『叄』 SSH的工作原理

傳統的網路服務程序,比如 FTP , POP , Telnet ,本質上都是不安全的,因為它們在網路上用明文傳送數據、用戶賬號和用戶口令,很容易受到 中間人 攻擊方式的攻擊,攻擊者會冒充真正的伺服器接收用戶傳給伺服器的數據,然後再冒充用戶把數據傳給真正的伺服器。

為了滿足安全性的需求, IETF 的網路工作小組制定了 Secure Shell (縮寫為 SSH ),這是一項創建在 應用層 和 傳輸層 基礎上的安全協議,為計算機上的 Shell 提供安全的傳輸和使用環境。

SSH 是目前較可靠,專為遠程登錄會話和其他網路服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄漏問題。通過 SSH 可以對所有傳輸的數據進行加密,也能夠防止DNS欺騙和IP欺騙。

本文將會重點討論 SSH 中用到的加密演算法和建立安全連接的過程。

為了保證信息傳輸的安全性, SSH 使用了對稱加密、非對稱加密和散列等技術。

對稱密鑰加密又稱為對稱加密、私鑰加密、共享密鑰加密,是密碼學中一類加密演算法。這類演算法在加密和解密時使用相同的密鑰,或是使用兩個可以簡單地相互推算的密鑰。

SSH 使用對稱密鑰加密整個連接過程中傳輸的信息。值得注意的是,用戶自己創建的public/private密鑰對僅僅用於驗證,不會用在加密連接上。對稱加密允許對密碼進行身份驗證,以防止第三方窺探。

共享密鑰通過密鑰交換演算法生成,它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道創建起一個密鑰。客戶端和服務端都參與了這個過程,過程的細節將在後面闡述。

生成的密鑰將用來加密這次會話過程中客戶端和服務端傳輸的數據。這個過程會在驗證客戶身份之前完成。

SSH 支持多種對稱密鑰演算法,包括AES,Blowfish,3DES,CAST128和Arcfour。客戶端和服務端可以配置採用演算法的列表。客戶端列表中第一個能被服務端支持的演算法將被採用。

比如在Ubuntu 14.04上,客戶端和服務端默認的配置如下: aes128-ctr , aes192-ctr , aes256-ctr , arcfour256 , arcfour128 , [email protected] , [email protected] , [email protected] , aes128-cbc , blowfish-cbc , cast128-cbc , aes192-cbc , aes256-cbc , arcfour 。
也就是說,如果兩台Ubuntu 14.04採用默認配置,它們總是會採用 aes128-ctr 演算法來加密連接。

在非對稱加密方法中,需要一對密鑰,一個是私鑰,一個是公鑰。這兩個密鑰數學相關。用公鑰加密後所得的信息,只能用私鑰才能解密。如果知道了其中一個,並不能計算另外一個。因此,如果公開了一對密鑰中的一個,並不會危害到另外一個的秘密性質。

SSH 在一些地方使用了非對稱加密。

在密鑰交換過程中使用到了非對稱加密。在這個階段,客戶端和服務端生成臨時密鑰對,並且交換公鑰來生成共享密鑰。

在身份驗證的過程中也使用了非對稱加密。 SSH 密鑰對用來向服務端驗證客戶端身份。客戶端創建一對密鑰,然後將公鑰上傳到遠程伺服器上,寫入文件 ~/.ssh/authorized_keys 。

在創建共享密鑰後,客戶端必須向服務端證明身份。服務端會使用文件中的公鑰加密一段信息,並將加密後的信息發送給客戶端。如果客戶端可以能夠破解這段信息,那麼就能夠證明自己擁有相關的私鑰。之後服務端會為客戶端設置shell環境。

散列是電腦科學中一種對資料的處理方法,它通過某種特定的演算法將要檢索的項與涌來檢索的索引關聯起來,生成一種便於搜索的數據結構(散列表)。它也常用做一種資訊安全的方法,由一串資料中經過散列演算法計算出來的資料指紋,來識別檔案和資料是否有被篡改。

SSH 主要使用了散列消息認證碼(Keyed-hash message authentication code,縮寫為HMAC),來確認消息沒有被篡改。

上面提到的對稱加密協商過程中,會使用消息認證碼(MAC)演算法。這個演算法會從客戶端支持的演算法中選出。

在密鑰協商完成後,所有的消息都必須攜帶MAC,用於通信雙方驗證消息的一致性。MAC值由共享密鑰,消息的分組序列和實際消息內容計算得到。

在對稱加密區域之外,MAC本身作為分組的最後部分被發送。研究者通常建議先機密數據,然後計算MAC

SSH 協議採用客戶端-服務端模型對兩方進行身份驗證,並對它們之間的數據進行加密。

服務端在指定埠監聽連接請求。它負責協商安全連接,認證連接方,並為客戶端生成正確的shell環境。

客戶端負責協商安全連接,驗證伺服器的身份是否與以前記錄的信息相匹配,並提供憑證進行身份驗證。

SSH會話分為兩個階段。第一個是同意和建立加密來保護未來的溝通。第二個階段是對用戶進行身份驗證,並發現是否應該授予對伺服器的訪問許可權。

當客戶端發起請求後,服務端返回支持的協議版本。如果客戶端可以匹配其中一個協議版本,則連接繼續。服務端會提供它的公共主機密鑰,客戶端可以用這個密鑰來驗證服務端是否合法。

此時,通信雙方採用迪菲-赫爾曼演算法來協商會話密鑰。

該演算法的大致過程如下:

用於其餘連接的共享密鑰加密被稱為二進制數據包協議。上述過程允許雙方平等地參與生成共享密鑰。

生成的密鑰是對稱密鑰,這意味著用於加密消息的密鑰也可以用於解密。其目的是將後面的通信包裝在不能被外部人員解密的加密隧道中。

在生成會話密鑰後,就開始進行用戶身份驗證。

根據伺服器接受的方式,有幾種不同的方法可用於身份驗證。

最簡單的方法是密碼驗證,其中伺服器要求客戶端輸入嘗試登陸賬號的密碼。密碼是通過協商加密發送的。

雖然密碼被加密,但由於密碼的復雜性受到限制,因此通常不建議使用此方法。與其他身份驗證的方法相比,自動腳本相對容易攻破正常長度的密碼。

最為推薦的選擇是使用SSH密鑰對。SSH密鑰對是非對稱密鑰。

公鑰用於加密只能用私鑰解密的數據。公鑰可以自由共享,因為沒有從公鑰中導出私鑰的方法。

驗證流程如下:

可以看到,密鑰的不對稱性允許服務端使用公鑰加密消息給客戶端。然後,客戶端可以通過正確解密消息來證明它擁有私鑰。

筆者本科專業是信息安全,不過畢業後並沒有從事安全行業,工作4年課堂上學習的知識基本忘的差不多了。
而SSH算是工作中最常用到的東西之一,其工作原理涉及不少密碼學的東西。
寫這篇博文,一是希望能幫助讀者了解SSH,二也是希望自己能撿起一些專業知識。在互聯網/軟體相關行業里,不論是否從事安全工作,了解這些東西都是很有必要的。

『肆』 非對稱加密、SSH加密演算法、數字簽名簡介

非對稱加密演算法的核心源於數學問題,它存在公鑰和私鑰的概念,要完成加解密操作,需要兩個密鑰同時參與。我們常說的「公鑰加密,私鑰加密」或「私鑰加密, 公鑰解密」都屬於非對稱加密的范疇。公鑰加密的數據必須使用私鑰才可以解密,同樣,私鑰加密的數據也 只能通過公鑰進行解密。
  相比對稱加密,非對稱加密的安全性得到了提升,但是也存在明顯的缺點,非對稱加解密的效率要遠遠小於對稱加解密。所以非對稱加密往往被用在一些安全性要求比較高的應用或領域中。

RSA加密演算法是一種典型的非對稱加密演算法,它基於大數的因式分解數學難題,它也是應用最廣泛的非對稱加密演算法,於1978年由美國麻省理工學院(MIT)的三位學者:Ron Rivest、Adi Shamir 和 Leonard Adleman 共同提出。
  它的原理較為簡單,我們假設有消息發送方A和消息接收方B,通過下面的幾個步驟,我們就可以完成消息的加密傳遞:
 (1)消息發送方A在本地構建密鑰對,公鑰和私鑰;
 (2)消息發送方A將產生的公鑰發送給消息接收方B;
 (3)B向A發送數據時,通過公鑰進行加密,A接收到數據後通過私鑰進行解密,完成一次通信;
 (4)反之,A向B發送數據時,通過私鑰對數據進行加密,B接收到數據後通過公鑰進行解密。
  由於公鑰是消息發送方A暴露給消息接收方B的,所以這種方式也存在一定的安全隱患,如果公鑰在數據傳輸過程中泄漏,則A通過私鑰加密的數據就可能被解密。
  如果要建立更安全的加密消息傳遞模型,需要消息發送方和消息接收方各構建一套密鑰對,並分別將各自的公鑰暴露給對方,在進行消息傳遞時,A通過B的公鑰對數據加密,B接收到消息通過B的私鑰進行解密,反之,B通過A的公鑰進行加密,A接收到消息後通過A的私鑰進行解密。
  當然,這種方式可能存在數據傳遞被模擬的隱患,我們可以通過數字簽名等技術進行安全性的進一步提升。由於存在多次的非對稱加解密,這種方式帶來的效率問題也更加嚴重。可以詳讀這兩篇文章:RSA 演算法原理 (一) (二)

在SSH安全協議的原理中, 是一種非對稱加密與對稱加密演算法的結合,先看下圖:

這里進行一下說明:
(1)首先服務端會通過非對稱加密,產生一個 公鑰 私鑰
(2)在客戶端發起請求時,服務端將 公鑰 暴露給客戶端,這個 公鑰 可以被任意暴露;
(3)客戶端在獲取 公鑰 後,會先產生一個由256位隨機數字組成的會話密鑰,這里稱為口令;
(4)客戶端通過 公鑰 將這個口令加密,發送給伺服器端;
(5)伺服器端通過 私鑰 進行解密,獲取到通訊口令;
 之後,客戶端和服務端的信息傳遞,都通過這個口令進行對稱的加密。
 這樣的設計在一定程度上提高了加解密的效率,不過,與客戶端服務端各構建一套密鑰對的加解密方式相比,在安全性上可能有所下降。在上面所述的通過口令進行加密的過程中,數據也是可以被竊聽的,不過由於密鑰是256個隨機數字,有10的256次方中組合方式,所以破解難度也很大。相對還是比較安全的。服務端和客戶端都提前知道了密鑰,SSH的這種方式,服務端是通過解密獲取到了密鑰。

現在知道了有非對稱加密這東西,那數字簽名是怎麼回事呢?
 數字簽名的作用是我對某一份數據打個標記,表示我認可了這份數據(簽了個名),然後我發送給其他人,其他人可以知道這份數據是經過我認證的,數據沒有被篡改過。
 有了上述非對稱加密演算法,就可以實現這個需求:

閱讀全文

與ssh公匙加密相關的資料

熱點內容
如何解決解壓館的劣勢 瀏覽:320
plc編程模塊化 瀏覽:245
單片機寄存器地址 瀏覽:396
七貓免費小說緩存加密 瀏覽:29
天津保稅倉有溯源碼 瀏覽:332
安卓9開發版什麼時候推送 瀏覽:61
程序員可以天天加班嗎 瀏覽:499
垃圾壓縮車品牌 瀏覽:555
自製搜索引擎pdf 瀏覽:76
觸漫安卓手機怎麼登蘋果的號 瀏覽:320
銀行app怎麼收信用卡的錢 瀏覽:288
java十進制轉十六進制演算法 瀏覽:920
pos刷卡需要app認證怎麼弄 瀏覽:252
快速配IP命令 瀏覽:829
小程序後台源碼導入 瀏覽:920
蘋果手機app上的未讀怎麼取消 瀏覽:514
蜻蜓fm導出文件夾 瀏覽:514
我的世界怎麼弄人家的伺服器 瀏覽:361
pm編程軟體是什麼 瀏覽:318
移動硬碟有一個文件夾沒有了 瀏覽:42