Linux openssl介紹
SSL和TLS
瞭解openssl之前,我們首先要了解SSL\TLS是什麼。
SSL(Secure Sockets Layer)是一個協議,叫作安全套接層協議。旨在為應用層資料提供加密的傳輸層通道。,即資料從應用層去往傳輸層,會首先被ssl給加密。
但是隨著時間的發展,SSL的繼任者TLS(Transport Layer Security)傳輸層安全協議被引入,為網路連線提供了更高階的安全性,TLS提供更多的加密演算法和選擇,所以開始逐漸取代了早期的SSL版本。

例如:
在引入SSL和TLS之前,使用HTTP協議的請求和響應是明文的,這意味著資料包在傳輸過程中容易被第三方竊聽、抓取或篡改。引入SSL/TLS之後,當資料從應用層傳送至傳輸層時,它會被SSL或TLS加密。這樣,一個安全的通道被建立,確保資料從傳送方(一個端)到接收方(另一個端)的整個路徑都是加密的,從而實現端到端的安全性。
應用層資料在前往傳輸層加密的原因;
一直有一個疑問,為什麼應用層的資料要在傳輸層加密,而不是在網路層或者其它層進行加密。剛開始以為應用層資料肯定要從傳輸層經過,如果在傳輸層已經被別人捕獲了,在下一層加密沒意義了。後面才認識到這是有考慮的:
-
1. 在傳輸層對應用層資料進行加密,具有很強的選擇性,因為傳輸層加密允許為不同的應用選擇是否需要加密,可以給指定的應用加密,如果在網路層或者資料鏈路層,全部都會被加密。 -
2. 傳輸層加密能保證端到端的安全性,網路層或資料鏈路層加密可能只會在兩個裝置或兩個網路之間提供加密 -
3. 將資料從傳輸層加密了,在網路層或資料鏈路層被捕獲了別人耶看不懂。
openssl
OpenSSL是一個開源的工具庫和工具集,用於處理SSL和TLS協議以及對資料進行加密和解密的各種操作。
openssl中文網: https://www.openssl.net.cn/
一般我們最常用的工具,就是這個軟體包裡面提供的一個叫作 openssl 的命令列工具,透過它可以實現一些加密演算法,像SSL、TLS等等。
在Linux發行版系統中,一般預設就安裝了openssl工具,透過 openssl verson 就可以檢視openssl的版本資訊。

openssl基礎用法
實現對稱加密
對稱加密就是加密和解密使用的是同一個金鑰,是透過將原始資料分割成若干塊來逐個進行加密,所以效率高、速度快
openssl enc -e 演算法型別 -a -salt -in 需要加密的檔案 -out 存放加密生成的結果的檔案
例如:
openssl enc -e -des3 -a -salt -in file1 -out file1.cipher

說明:
-
• 使用 -salt 來加鹽(加鹽就是在進行雜湊加密的時候加上隨機字串)的時候,openssl會自動生成一個隨機的鹽,並在加密過程中使用它 -
• 除了 -des3 這種堆成加密型別,還有-des等型別。使用 man openssl enc 可以看到其它的一些加密型別應該使用的對應引數 -
• 使用 -a 引數可以將加密後的內容透過base64這種彪馬格式來顯示
實現對稱解密
openssl enc -d 演算法型別 -a -salt -in 需要解密的檔案 -out 解密後的問題
例如:
openssl enc -d -des3 -a -salt -in file1.cipher -out file1_new

說明:
-
• 演算法型別需要和加密時使用的保持一致 -
• 使用對稱加密的時候會要求提示輸入密碼。因為對稱加密演算法使用同一個密碼進行加密和解密
實現非對稱加密
非對稱加密的特點是金鑰成對出現,加密和解密用的金鑰不相同,並且通訊雙方都需要各自的金鑰和私鑰
-
• 如果使用公鑰加密、私鑰解密。加密的資料只能自己解開,能充分保證資料的安全 -
• 如果使用私鑰加密,公鑰解密。這樣能確定資料的來源性,這就是我們所說的數字簽名
生成私鑰:
openssl genrsa -out 存放私鑰的檔案 使用的加密演算法型別
例如:
openssl genrsa -out b.enc

說明:
-
• 不指定金鑰的長度,預設長度就是2048,金鑰長度越長,其加密強度就越高,加密何解密時間越長,一般使用預設的就可以了 -
• 不指定加密演算法的型別,預設使用的非對稱加密演算法是RSA -
• 生成的金鑰預設是按照 PEM格式 輸出,即以base64格式顯示文字資訊。
生成公鑰:
公鑰鑰是隱藏在私鑰內部的,可以透過私鑰的到公鑰
openssl rsa -in 私鑰檔案 -pubout -out 提取出來儲存的公鑰檔案
例如:

實現非對稱解密
公鑰加密:
openssl rsautl -encrypt -pubin -inkey 公鑰檔案 -in 需要加密的檔案 -out 加密後的檔案
私鑰解密:
openssl rsautl -decrypt -inkey 私鑰檔案 -in 需要解密的檔案 -out 解密後的檔案
實現單向雜湊
hash是一種單向的加密演算法,是不可逆的。使用雜湊演算法加密出來的結果就叫做摘要,這玩意兒有個特點就是長度固定,內容不同。一旦原資料發生改變,摘要也會隨之發生改變,所以一般用來確認資料的完整性,看有沒有被人篡改。
在這裡有一個叫作指紋的概念,指紋是每個人獨一無二的,不同的人(資料)有不同的指紋(摘要),但是隻知道了指紋(摘要),也不能知道是誰(不能透過摘要推出原資料)。
openssl dgst 使用的雜湊演算法 對哪個檔案生成摘要
例如:
openssl dgst file1

說明:
-
• 不指定雜湊演算法,預設使用的是 SHA256演算法,可以使用 man openssl dgst檢視對應選項代表的雜湊演算法 -
• 不指定顯示的型別,預設顯示的是十六進位制的字元
生成使用者密碼
可以使用openssl來給使用者生成密碼,使用 useradd 命令建立使用者的時候可以指定使用者的密碼,但是這個密碼必須是加密的密碼才行,這個時候就可以使用openssl來生成一個。
其實就是利用雜湊演算法來給密碼生成一個摘要值
openssl passwd 演算法型別 使用者密碼
不指定任何雜湊演算法選項,那麼預設使用的是傳統的UNIX crypt() 方法,比 MD5 還老
演算法型別說明:
-
• -6:表示採用sha512這種加密算,也會預設使用隨機的鹽 -
• -5:sha256演算法,也會預設使用隨機的鹽 -
• -1:md5演算法,會預設生成一個隨機的鹽來與密碼一起雜湊
這三種都是UNIX密碼雜湊方案的一部分
例如:
useradd bob -m -s /bin/bash -p $(openssl passwd -6 redhat)

使用useradd建立使用者的時候,如果沒指定相關屬性,會預設使用 /etc/default/useradd中定義的屬性資訊。
生成隨機數
openssl rand 顯示格式(主要有hex和base64) 輸出的隨機位元組數量
例如:生成16個隨機位元組並以十六進位制格式輸出
openssl rand -hex16

說明: 一個十六機制數由4個二進位制陣列成,一個位元組8位,所以一個十六進位制數等於兩個位元組。總共會輸出三十二個字元
例如:以base64編碼形式顯示隨機數
openssl rand -base64 16
base64編碼介紹
base64是一種用64個字元來表示任意二進位制資料的方法。在一些早期的協議中,例如smtp、http。他們只設計了ASCII字元資料的傳輸,當需要包含非ASCII字元或者二進位制資料時就會出問題,因為雖然二進位制資料都是由於0和1組成,但是難點在於如何表示和傳輸這些0和1。
這個時候使用base64編碼完美解決問題,將二進位制資料轉為一個僅由ASCII字元組成的安全字串,這樣可以避免由於二進位制資料的傳輸而導致的任何解釋或傳輸問題
編碼原理
-
1. 先將要三個位元組的二進位制資料(一共24位),重新分為4組,每組6位。(每6位就可以表示一個值,範圍從0到63) -
2. 然後將每個6位的資料(一個組)轉換為十進位制數字,然後根據base64的字元集得到相應的字元。 -
3. 再重複這個過程直到所有的輸入資料都被處理完 -
4. 如果原始資料(即待編碼的資料)的長度不是3個位元組的整數倍(base64將每3個位元組作為一個單元來處理),會新增填充字元,即=,來使其長度滿足要求。這就是看到等號的原因
連結:https://www.cnblogs.com/heyongshen/p/17787948.html
(版權歸原作者所有,侵刪)
文末福利
就目前來說,傳統運維衝擊年薪30W+的轉型方向就是SRE&DevOps崗位。
為了幫助大家早日擺脫繁瑣的基層運維工作,給大家整理了一套高階運維工程師必備技能資料包,內容有多詳實豐富看下圖!
共有 20 個模組





······



以上所有資料獲取請掃碼
備註:最新運維資料

100%免費領取
(後臺不再回復,掃碼一鍵領取)