SSL和TLS 瞭解openssl之前,我們首先要瞭解SSL\TLS是什麼。 SSL(Secure Sockets Layer)是一個協議,叫作安全套接層協議。旨在為應用層數據提供加密的傳輸層通道。,即數據從應用層去往傳輸層,會首先被ssl給加密。 但是隨著時間的發展,SSL的繼任者TLS(Tran ...
SSL和TLS
瞭解openssl之前,我們首先要瞭解SSL\TLS是什麼。
SSL(Secure Sockets Layer)是一個協議,叫作安全套接層協議。旨在為應用層數據提供加密的傳輸層通道。,即數據從應用層去往傳輸層,會首先被ssl給加密。
但是隨著時間的發展,SSL的繼任者TLS(Transport Layer Security)傳輸層安全協議被引入,為網路連接提供了更高級的安全性,TLS提供更多的加密演算法和選擇,所以開始逐漸取代了早期的SSL版本。
例如:
在引入SSL和TLS之前,使用HTTP協議的請求和響應是明文的,這意味著數據包在傳輸過程中容易被第三方竊聽、抓取或篡改。引入SSL/TLS之後,當數據從應用層發送至傳輸層時,它會被SSL或TLS加密。這樣,一個安全的通道被建立,確保數據從發送方(一個端)到接收方(另一個端)的整個路徑都是加密的,從而實現端到端的安全性。
應用層數據在前往傳輸層加密的原因;
一直有一個疑問,為什麼應用層的數據要在傳輸層加密,而不是在網路層或者其它層進行加密。剛開始以為應用層數據肯定要從傳輸層經過,如果在傳輸層已經被別人捕獲了,在下一層加密沒意義了。後面才認識到這是有考慮的:
-
在傳輸層對應用層數據進行加密,具有很強的選擇性,因為傳輸層加密允許為不同的應用選擇是否需要加密,可以給指定的應用加密,如果在網路層或者數據鏈路層,全部都會被加密。
-
傳輸層加密能保證端到端的安全性,網路層或數據鏈路層加密可能只會在兩個設備或兩個網路之間提供加密
-
將數據從傳輸層加密了,在網路層或數據鏈路層被捕獲了別人耶看不懂。
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 -hex 16
說明: 一個十六機制數由4個二進位數組成,一個位元組8位,所以一個十六進位數等於兩個位元組。總共會輸出三十二個字元
例如:以base64編碼形式顯示隨機數
openssl rand -base64 16
base64編碼介紹
base64是一種用64個字元來表示任意二進位數據的方法。在一些早期的協議中,例如smtp、http。他們只設計了ASCII字元數據的傳輸,當需要包含非ASCII字元或者二進位數據時就會出問題,因為雖然二進位數據都是由於0和1組成,但是難點在於如何表示和傳輸這些0和1。
這個時候使用base64編碼完美解決問題,將二進位數據轉為一個僅由ASCII字元組成的安全字元串,這樣可以避免由於二進位數據的傳輸而導致的任何解釋或傳輸問題
編碼原理
-
先將要三個位元組的二進位數據(一共24位),重新分為4組,每組6位。(每6位就可以表示一個值,範圍從0到63)
-
然後將每個6位的數據(一個組)轉換為十進位數字,然後根據base64的字元集得到相應的字元。
-
再重覆這個過程直到所有的輸入數據都被處理完
-
如果原始數據(即待編碼的數據)的長度不是3個位元組的整數倍(base64將每3個位元組作為一個單元來處理),會添加填充字元,即=,來使其長度滿足要求。這就是看到等號的原因