1. 程式人生 > >OpenSSL開發學習總結

OpenSSL開發學習總結

web 分解 iam 模塊 關閉 odi 選項 swp gda

from https://mp.weixin.qq.com/s/sJBGJ88_-N-LdA8EHywfAA

1.對稱加密算法

對稱加密算法只使用一個密鑰。數據的發送方準備好原始數據和一個加密密鑰,加密產生密文,並將密文與密鑰發送出去。接收方在解密時,使用同樣的密鑰對數據進行解密。對稱加密算法主要有以下四種加密模式:

電子密碼本模式Electronic Code Book(ECB):最基本的加密模式。將原始數據分為固定長度的若幹組,然後對每一組使用同一個密鑰進行加密。該模式簡單、有利於並行計算,但如此一來相同的明文將被加密成相同的密文,容易受到密碼本重放攻擊,一般情況下很少使用。

加密塊鏈模式Cipher Block Chaining(CBC):該模式同樣是將原始數據分解成固定長度的若幹組,一個加密組在被加密之前,需要與前面已加密組的密文進行異或運算,再將計算結果進行加密得到該組的密文。這種加密模式要求第一組明文在加密之前,需要設置一個初始化變量。選擇不同的初始向量,相同的明文加密後會形成不同的密文。由於加密塊鏈模式加密後的密文是上下文相關的,如果一個分組丟失,後面的分組將全部作廢。

加密反饋模式Cipher Feedback Mode(CFB):類似於自同步序列密碼,分組加密後,按8位分組將密文和明文進行移位異或後得到輸出同時反饋回移位寄存器。其加密步驟如下(解密步驟與加密步驟相反):

1) 加密:加密過程使用了一個64位的移位寄存器,在第一步加密過程中產生64位的初始向量IV;

2) 取初始向量IV最左邊的8位與明文前8位進行異或運算,得到的值作為8位密文單元;

3) 8位的密文單元被移至位寄存器的最右端,其它位則向左移動8位,最左端8比特丟棄;

4) 重復步驟1-3繼續加密,與第2、3、…段明文輸入異或,如此直到所有明文單元都完成加密。

該模式的優點是數據可以按字節進行加解密。加密反饋模式也是上下文相關的,明文的一個錯誤會影響後面的密文。

輸出反饋模式Output Feedback Mode(OFB):將分組密碼作為同步序列密碼運行,和加密反饋模式相似,不過輸出反饋模式使用的是前一個N位密文輸出分組反饋回移位寄存器。

2.非對稱加密算法

非對稱加密算法需要兩個密鑰:公鑰(Public Key)和私鑰(Private Key)。公鑰與私鑰是成對存在的,若用公鑰對原始數據進行加密,則只有使用對應的私鑰才能解密;若用密鑰對原始數據進行簽名,則只有用對應的公鑰才能驗證。由於加密和解密使用的是兩個不同的密鑰,所以這一類算法稱為非對稱加密算法。非對稱加密算法實現機密信息交換的基本過程如下:

1) 甲方生成一對密鑰並將其中的一把作為公鑰向其他用戶(這裏稱為乙方)公開;

2) 乙方得到該公用密鑰,使用該密鑰對要發送的數據進行加密後,發送給甲方;

3) 甲方再用自己保存的私鑰,對接收到的信息進行解密。

此外,甲方還可以使用乙方的公鑰對原始數據進行數字簽名後,發送給乙方;乙方再用自己的私鑰對數據進行驗證。

3.消息摘要算法

消息摘要算法是一種能產生特殊輸出格式的算法,這種算法的特點:

1) 加密過程不需要密鑰;

2) 無論用戶輸入什麽長度的原始數據,計算出來的消息摘要長度總是固定的,即變長輸入,定長輸出;

3) 相同的輸入將會產生相同的輸出;但只要輸入的數據發生改變,輸出的消息摘要便完全不同;

4) 消息摘要是單向、不可逆的。理論上無法通過反向運算取得原始數據。

通常消息摘要算法被用來做數據完整性校驗。

4.數字簽名

數字簽名(又稱公鑰數字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用於鑒別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用於簽名,另一個用於驗證,是非對稱加密算法和消息摘要算法結合體。其基本模型如下圖所示:

技術分享

數字簽名的特點主要有:

  • l私鑰用於簽名,公鑰用於驗證;

  • 簽名時使用原始數據和私鑰,驗證時使用原始數據、公鑰和簽名值;

  • l實際使用時,通常需要對原始數據做摘要處理,再利用私鑰進行簽名。

5.PKI/CA

關於公共密鑰基礎設施PKI的一些基礎概念與核心組成元素整理如下:

技術分享

更多關於OpenSSL的背景知識與基本概念,可參考:

http://www.cnblogs.com/f-ck-need-u/p/6089523.html

二、OpenSSL環境搭建

公司的服務器已經預裝了較低版本的OpenSSL,但由於此版本存在比較嚴重的安全漏洞,建議升級OpenSSL版本。

三、OpenSSL自建私有CA與證書頒發

在自建私有CA之前,先介紹兩種不同的PKI/CA建設模式:第三方托管型CA和自建型CA:

第三方托管型也稱服務型,是指CA系統的服務器遠程托管在第三方PKI/CA服務提供商的機房,服務提供商需要承擔PKI/CA系統的整體建設、運營和維護,通過網絡向企業內部提供證書服務的模式。客戶只需要購買相應的服務,並完成本地環境的部署即可。

自建型是指企業在內部自行部署CA系統服務器,通過內部局域網實現本地訪問的模式。自建模式適用於企業用戶量大的內部OA辦公,及企業內部分支機構間的安全保護。

利用OpenSSL,實現自建私有CA並頒發證書的流程具體步驟如下:

1. 查看OpenSSL配置文件 /etc/pki/tls/openssl.cnf 中關於CA的配置選項和文件路徑:

技術分享

2. 在本地機器建立CA服務器,生成密鑰:

技術分享

3. 生成CA自簽屬證書(X.509標準):

技術分享

該指令是生成證書簽署請求,指定了密鑰文件路徑 private/cakey.pem 和證書文件的生成路徑 /etc/pki/CA/cacert.pem,同時規定了證書的過期天數為 3650 天。

4. 初始化工作環境,創建必要的文件:

技術分享

5. 證書生成簽署請求(客戶端生成並發送給CA認證中心):

技術分享

6. 客戶端把 client.csr 發送給CA認證中心後,CA認證中心為客戶端頒發證書(測試過程中,CA認證中心和客戶端在同一臺電腦上):

技術分享

自此,完成了自建 CA 給客戶頒發證書的所有步驟,證書存放路徑:/home/client/ssl/client.crt

四、基於OpenSSL命令行的數字簽名和文件加密流程

首先要明白的是,數字簽名的過程是計算出數字摘要,然後使用私鑰對數字摘要進行簽名,而摘要是使用md5、sha512等算法計算得出的。基於OpenSSL命令行的數字簽名和文件加密流程,可以分為文件發送方A和接收方B兩個處理模塊,數字簽名和文件加密的前提是發送方A和接收方B彼此之間已經建立SSL連接,兩者均生成了成對的私鑰和公鑰,並得到了對方的公鑰:

1. 對於發送方A:

1)生成私鑰:OpenSSL> genrsa -passout pass:12345678 -out aprivate.pem 2048

2)生成對應的公鑰:OpenSSL> rsa -passin pass:12345678 -pubout -in aprivate.pem -out apublic.pem

3)使用接收方B的公鑰加密文件:OpenSSL> rsautl -encrypt -pubin -inkey bpublic.pem -in data.txt -out encodeData.txt

4)計算文件的消息摘要:OpenSSL> dgst -sha1 -out md.txt data.txt

5)用發送方A的私鑰給消息摘要簽名:OpenSSL> rsautl -sign -inkey aprivate.pem -in md.txt -out signature.bin

6)最後將加密的文件encodeData.txt和消息摘要簽名signature.bin發送給接收方B

2. 對於接收方B:

1)生成私鑰:OpenSSL> genrsa -passout pass:87654321 -out bprivate.pem 2048

2)生成對應的公鑰:OpenSSL> rsa -passin pass:87654321 -pubout -in bprivate.pem -out bpublic.pem

3)接收A發來的文件 edata.txt,使用用B的私鑰進行解密:OpenSSL> rsautl -decrypt -inkey bprivate.pem -in encodeData.txt -out decodeData.txt

4)計算data.txt的信息摘要:OpenSSL> dgst -sha1 -out md2.txt data.txt

5)用發送方A的公鑰解密數字簽名:OpenSSL> rsautl -verify -pubin -inkey apublic.pem -in signature.bin -out md3.txt

6)最後比較:md2.txt和md3.txt的內容是否完全一致(SHA1(data.txt)= 07a03d3073bb34f57191335e6495190abe7300bc),一致則表示該文件沒有被篡改、替換過

五、基於OpenSSL的TLS協議握手與通信建立編程實例

基於OpenSSL的TLS安全通信,客戶端和服務器端的編程流程如下圖所示:

技術分享

在使用OpenSSL完成安全通信之前,必須進行相應的SSL/TLS協議初始化工作,包括初始化類庫、加載SSL算法與錯誤信息等等;在開始SSL/TLS會話之前,需要為客戶端和服務器制定本次會話所使用的協議,協商完成後將創建CTX會話環境。

當CTX會話環境建立之後,需要使用socket綁定SSL套接字。SSL套接字是建立在普通TCP套接字的基礎之上。成功創建SSL套接字後,客戶端與服務器端需分別調用函數SSL_connect()和SSL_accept()完成握手過程,並進行安全的數據傳輸。

當客戶端和服務器之間完成數據通信之後,需要依次關閉SSL套接字、釋放SSL套接字,最後釋放SSL會話環境。

以下基於OpenSSL的TLS協議握手與通信建立代碼:

客戶端:

技術分享

技術分享

技術分享

技術分享

服務器端:

技術分享

技術分享

技術分享

技術分享

技術分享

OpenSSL開發學習總結