Python-SecureHTTPC/S 架構(gòu)的加密通信庫
Python-SecureHTTP,C/S 架構(gòu)的加密通信庫。
說在前面:
在HTTP協(xié)議中,傳輸數(shù)據(jù)是明文,被第三方截獲后很容易看出數(shù)據(jù),所以現(xiàn)在主流建議是HTTPS加密傳輸,如Chrome,新版本用HTTP會提示不安全。
除此之外,我們也可以約定一種或多種加密算法對傳輸?shù)臄?shù)據(jù)在客戶端加密、服務端解密,并且使用簽名,這樣第三方截獲,也無法獲取數(shù)據(jù)明文,且防篡改,大大增加傳輸安全性。
軟件內(nèi)容:
通過使用RSA+AES讓HTTP傳輸更加安全,即C/S架構(gòu)的加密通信!
加密算法:
Python-SecureHTTP使用的加密算法相關(guān)如下,使用相同標準,其他語言如Java、PHP、Go、JS等均可通信。
1. AES加解密::
模式:CBC
密鑰長度:128位
密鑰key和初始偏移向量iv一致
補碼方式:PKCS5Padding
加密結(jié)果編碼方式:十六進制
2. RSA加解密::
算法:RSA
填充:RSA_PKCS1_PADDING
密鑰格式:符合PKCS#1規(guī)范,密鑰對采用PEM形式
3. 簽名::
對請求參數(shù)或數(shù)據(jù)添加公共參數(shù)后排序再使用MD5簽名。
更多了解可以參考https://www.jianshu.com/p/b092b4fac27c,上面包的實現(xiàn)邏輯參考此文。
安裝使用:
1. 安裝:pip install Python-SecureHTTP
2. 邏輯:
客戶端上傳數(shù)據(jù)加密 ==> 服務端獲取數(shù)據(jù)解密 ==> 服務端返回數(shù)據(jù)加密 ==> 客戶端獲取數(shù)據(jù)解密
NO.1 客戶端上傳數(shù)據(jù)加密流程::
1. 客戶端隨機產(chǎn)生一個16位的字符串,用以之后AES加密的秘鑰,AESKey。
2. 使用RSA對AESKey進行公鑰加密,RSAKey。
3. 參數(shù)加簽,規(guī)則是:對所有請求或提交的字典參數(shù)按key做升序排列并用"參數(shù)名=參數(shù)值&"形式連接。
4. 將明文的要上傳的數(shù)據(jù)包(字典/Map)轉(zhuǎn)為Json字符串,使用AESKey加密,得到JsonAESEncryptedData。
5. 封裝為{key : RSAKey, value : JsonAESEncryptedData}的字典上傳服務器,服務器只需要通過key和value,然后解析,獲取數(shù)據(jù)即可。
NO.2 服務端獲取數(shù)據(jù)解密流程::
1. 獲取到RSAKey后用服務器私鑰解密,獲取到AESKey
2. 獲取到JsonAESEncriptedData,使用AESKey解密,得到明文的客戶端上傳上來的數(shù)據(jù)。
3. 驗簽
4. 返回明文數(shù)據(jù)
NO.3 服務端返回數(shù)據(jù)加密流程::
1. 將要返回給客戶端的數(shù)據(jù)(字典/Map)進行加簽并將簽名附屬到數(shù)據(jù)中
2. 上一步得到的數(shù)據(jù)轉(zhuǎn)成Json字符串,用AESKey加密處理,記為AESEncryptedResponseData
3. 封裝數(shù)據(jù){data : AESEncryptedResponseData}的形式返回給客戶端
NO.4 客戶端獲取數(shù)據(jù)解密流程::
1. 客戶端獲取到數(shù)據(jù)后通過key為data得到服務器返回的已經(jīng)加密的數(shù)據(jù)AESEncryptedResponseData
2. 對AESEncryptedResponseData使用AESKey進行解密,得到明文服務器返回的數(shù)據(jù)。
3. 調(diào)用:
Python-SecureHTTP提供兩個核心類,EncryptedCommunicationClient(針對邏輯NO.1、NO.4)和EncryptedCommunicationServer(針對邏輯NO.2、NO.3)。
4. 核心類說明:
4.1 EncryptedCommunicationClient:客戶端加密通信類,提供clientEncrypt(NO.1加密)、clientDecrypt(NO4解密)兩個方法。
4.2 EncryptedCommunicationServer:服務端加密通信類,提供serverDecrypt(NO.2解密)、serverEncrypt(NO.3加密)兩個方法。
4.3 更多API文檔,請訪問https://python-securehttp.readthedocs.io/#api-documentation
示例代碼:
1. 不同語言的AES加密的示例:https://gitee.com/staugur/Python-SecureHTTP/tree/master/examples/AES-CBC-PKCS5Padding
2. 不同語言的RSA加密的示例:https://gitee.com/staugur/Python-SecureHTTP/tree/master/examples/RSA-PKCS1-PEM
3. 不同語言的MD5簽名的示例:還沒有找
4. 不同語言的HMAC-SHA256的示例(暫時沒用此算法作簽名):https://gitee.com/staugur/Python-SecureHTTP/tree/master/examples/HMAC-SHA256
5. B/S示例:https://gitee.com/staugur/Python-SecureHTTP/tree/master/examples/BS-RSA
說在后面:
!歡迎提交PR、Issue
