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 正反向加解密模塊的文章。