Python-SecureHTTP C/S 架构的加密通信库 项目简介
说在前面: 在HTTP协议中,传输数据是明文,被第三方截获后很容易看出数据,所以现在主流建议是HTTPS加密传输,如Chrome,新版本用HTTP会提示不安全。 除此之外,我们也可以约定一种或多种加密算法对传输的数据在客户端加密、服务端解密,并且使用签名,这样第三方截获,也无法获取数据明文,且防篡改,大大增加传输安全性。 软件内容: 通过使用RSA+AES让HTTP传输更加安全,即C/S架构的加密通信!加密算法: Python-SecureHTTP使用的加密算法相关如下,使用相同标准,其他语言如Java、PHP、Go、JS等均可通信。 1. AES加解密:: 模式:CBC 密钥长度:128位 密钥key和初始偏移向量iv一致 补码方式:PKCS5Padding 加密结果编码方式:十六进制 2. RSA加解密:: 算法:RSA 填充:RSA_PKCS1_PADDING 密钥格式:符合PKCS#1规范,密钥对采用PEM形式 3. 签名:: 对请求参数或数据添加公共参数后排序再使用MD5签名。 更多了解可以参考https://www.jianshu.com/p/b092b4fac27c,上面包的实现逻辑参考此文。 安装使用: 1. 安装:pip install Python-SecureHTTP 2. 逻辑: 客户端上传数据加密 ==> 服务端获取数据解密 ==> 服务端返回数据加密 ==> 客户端获取数据解密
NO.1 客户端上传数据加密流程::
1. 客户端随机产生一个16位的字符串,用以之后AES加密的秘钥,AESKey。
2. 使用RSA对AESKey进行公钥加密,RSAKey。
3. 参数加签,规则是:对所有请求或提交的字典参数按key做升序排列并用"参数名=参数值&"形式连接。
4. 将明文的要上传的数据包(字典/Map)转为Json字符串,使用AESKey加密,得到JsonAESEncryptedData。
5. 封装为{key : RSAKey, value : JsonAESEncryptedData}的字典上传服务器,服务器只需要通过key和value,然后解析,获取数据即可。
NO.2 服务端获取数据解密流程::
1. 获取到RSAKey后用服务器私钥解密,获取到AESKey
2. 获取到JsonAESEncriptedData,使用AESKey解密,得到明文的客户端上传上来的数据。
3. 验签
4. 返回明文数据
NO.3 服务端返回数据加密流程::
1. 将要返回给客户端的数据(字典/Map)进行加签并将签名附属到数据中
2. 上一步得到的数据转成Json字符串,用AESKey加密处理,记为AESEncryptedResponseData
3. 封装数据{data : AESEncryptedResponseData}的形式返回给客户端
NO.4 客户端获取数据解密流程::
1. 客户端获取到数据后通过key为data得到服务器返回的已经加密的数据AESEncryptedResponseData
2. 对AESEncryptedResponseData使用AESKey进行解密,得到明文服务器返回的数据。 3. 调用: 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
NO.1 客户端上传数据加密流程::
1. 客户端随机产生一个16位的字符串,用以之后AES加密的秘钥,AESKey。
2. 使用RSA对AESKey进行公钥加密,RSAKey。
3. 参数加签,规则是:对所有请求或提交的字典参数按key做升序排列并用"参数名=参数值&"形式连接。
4. 将明文的要上传的数据包(字典/Map)转为Json字符串,使用AESKey加密,得到JsonAESEncryptedData。
5. 封装为{key : RSAKey, value : JsonAESEncryptedData}的字典上传服务器,服务器只需要通过key和value,然后解析,获取数据即可。
NO.2 服务端获取数据解密流程::
1. 获取到RSAKey后用服务器私钥解密,获取到AESKey
2. 获取到JsonAESEncriptedData,使用AESKey解密,得到明文的客户端上传上来的数据。
3. 验签
4. 返回明文数据
NO.3 服务端返回数据加密流程::
1. 将要返回给客户端的数据(字典/Map)进行加签并将签名附属到数据中
2. 上一步得到的数据转成Json字符串,用AESKey加密处理,记为AESEncryptedResponseData
3. 封装数据{data : AESEncryptedResponseData}的形式返回给客户端
NO.4 客户端获取数据解密流程::
1. 客户端获取到数据后通过key为data得到服务器返回的已经加密的数据AESEncryptedResponseData
2. 对AESEncryptedResponseData使用AESKey进行解密,得到明文服务器返回的数据。 3. 调用: 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