OpenSSL 本身是一個軟體庫,這個軟體被廣泛的應用在系統伺服器當中,他的主要功能是在網路通訊的過程中,保證資料的一致性以及資料傳輸過程中的安全性。軟體本身是由C語言編寫,這使得他具備了跨平臺的特性,OpenSSL 主要包括如下三大功能:
-
加解密: OpenSSL 具有豐富的加解密演算法庫,支援不同的加解密方式以及儲存祕鑰的方式,如對稱加密,非對稱加密,資訊摘要等內容
-
SSL 協議: OpenSSL 實現了 SSL 協議的的 SSLv2 和 SSLv3,支援了其中絕大部分演算法協議
-
證照操作: OpenSSL 自身提供了一種文字資料庫,支援證照的管理功能,包括證照祕鑰的產生、請求產生、證照籤發、吊銷和驗證等功能。
加解密的幾種形式
加解密的形式通常分為以下幾種:
-
對稱加密演算法
-
非對稱加密演算法
-
不可逆加密演算法
-
下面我們挨個來看這些加密演算法。
對稱演算法
對稱演算法是指資訊的傳送方和接收方使用同一份祕鑰去加解密資料。AES、DES 等都是常用的對稱加密演算法。
對稱演算法的優點是加解密的速度快,適合對於大資料量加密。缺點是因為只有一個祕鑰,所以祕鑰管理困難,只要暴露了,就很容易破解加密後的資訊。
非對稱演算法
非對稱演算法是指資訊的傳送方和接收方分別持有一份祕鑰。一份公開發布,稱公鑰;一份私有,稱祕鑰。祕鑰可以匯出對應的公鑰。RSA、DSA 等是常用的非對稱加密演算法。
一般情況下,資訊傳送者用公開金鑰去加密,而資訊接收者則用私用金鑰去解密。公鑰機制靈活,但加密和解密速度卻比對稱金鑰加密慢得多。不同的使用場景下,也會衍生出其他的使用方法,比如私鑰加密,公鑰解密。
RSA 加解密演算法
RSA 是一個流行的非對稱加密演算法, 生成公私鑰內容如下:
# 生成祕鑰
OpenSSL genrsa -out test.key 1024
# 從祕鑰中匯出公鑰
OpenSSL rsa -in test.key -pubout -out test_pub.key
# 公鑰加密檔案
echo "test" > hello
OpenSSL rsautl -encrypt -in hello -inkey test_pub.key -pubin -out hello.en
# 私鑰解密檔案
OpenSSL rsautl -decrypt -in hello.en -inkey test.key -out hello.de
不可逆加密演算法
不可逆加密演算法主要用於校驗檔案的一致性,摘要演算法就是其中一種。常用的摘要演算法有 MD5。
摘要演算法
摘要演算法用來把任何長度的明文以一定規則變成固定長度的一串字元。在做檔案一致性校驗的時候,我們通常都是先使用摘要演算法,獲得固定長度的一串字元,然後對這串字元進行簽名。接收者接收到檔案後,也會執行一遍摘要演算法後再簽名。前後資料一致,則表示檔案在傳輸過程沒有被竄改。
base64
特別需要注意的是,base64 不是加密演算法,它是編碼方式。 它可以方便傳輸過程 ASCII 碼和二進位制碼之間的轉換。類似於圖片或者一些文字協議,在傳輸過程中通常可以使用 base64 轉換成二進位制碼程式傳輸。
SSH 加密流程
-
客戶端傳送自己的金鑰 ID 給伺服器端
-
伺服器在自己的 authorized_keys 檔案中查詢是否存在此 ID 的公鑰
-
如果有,則伺服器生成一個隨機數,用當前 ID 的公鑰加密
-
伺服器將加密後的隨機數發給客戶端
-
客戶端用私鑰解密該隨機數,然後在本地為隨機數做 MD5 加密
-
客戶端將該 MD5 雜湊發給伺服器端
-
伺服器端為一開始自己生成的隨機數也做一個 MD5 雜湊,然後用通訊通道“公共的金鑰”將該雜湊加密,再跟客戶端發來的內容進行對比。如果雙方內容一致,則通過驗證,開放訪問許可權給客戶端
深入瞭解 OpenSSL 後,其對密碼學技術的功能支援會讓你激動不已,如果有興趣可以更加深入地瞭解其中的內容以及試驗不同加密方式在不同場景中的使用。放個小預告: 後續還會推出一篇用 pyo3 來給 python 編寫 rsa 正反向加解密模組的文章。