深度学习类文章回顾
【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】
【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】
【深度学习】YOLOV8数据标注及模型训练方法整体流程介绍及演示
【深度学习】行人跌倒行为检测软件系统
【深度学习】火灾检测软件系统
【深度学习】吸烟行为检测软件系统
【深度学习】数竹签演示软件系统
【深度学习】菜品目标检测软件系统
本文链接:http服务网络请求如何确保数据安全(含python示例源码)
一般情况下,在我们交付完甲方软件系统后,甲方都会请专业的团队进行漏洞检测,出具《xxx系统漏洞检测报告》,这其中我们经常会遇到的问题如下:
数据的保密性:使用国家密码管理局认可的对称加密算法(如AES)来确保数据的保密性
数据的完整性:可以使用HMAC(哈希消息认证码)来确保数据在传输过程中的完整性
AES(高级加密标准)对称加密通过以下方式保证数据的保密性:
除了使用随机IV确保加密的安全性,还结合了HMAC来确保数据的完整性。每次加密的结果都包含IV和HMAC,接收方使用这些信息验证数据的完整性和解密数据,确保传输过程中的数据既安全又完整。
通过随机IV和HMAC的结合,我们可以实现一个安全的加密传输系统,防止数据被攻击者篡改或重放,确保数据在传输过程中的安全性和完整性。
import hmac
import hashlib
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
import json
from typing import Tuple
SECRET_KEY = b'synjones2024zhc1'
# 加密函数
def encrypt_data(data: str) -> Tuple[str, str]:
cipher = AES.new(SECRET_KEY, AES.MODE_CBC) #
ct_bytes = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size)) # BLOCK_SIZE = 16 # 128 bits、默认使用PKCS7填充
iv = base64.b64encode(cipher.iv).decode('utf-8')
ct = base64.b64encode(ct_bytes).decode('utf-8')
# 加密后的密文和IV会被编码并传输
return iv, ct
# 解密函数
def decrypt_data(iv: str, ct: str) -> str:
try:
iv = base64.b64decode(iv)
ct = base64.b64decode(ct)
cipher = AES.new(SECRET_KEY, AES.MODE_CBC, iv) # 使用CBC模式
pt = unpad(cipher.decrypt(ct), AES.block_size) # 使用PKCS7填充
return pt.decode('utf-8')
except (ValueError, KeyError):
return None
3. HMAC生成函数
def generate_hmac(data: str) -> str:
return hmac.new(HMAC_KEY, data.encode('utf-8'), hashlib.sha256).hexdigest()
接下来我们来设计整个流程:
from flask import Flask, request, jsonify
import hmac
import hashlib
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
import json
from typing import Tuple
app = Flask(__name__)
# 共享密钥和HMAC密钥
SECRET_KEY = b'synjones2024zhc1' # 16字节,即128位密钥 确保是16个字符, 避免引起不必要的异常
HMAC_KEY = b'synjones2024zhc2' # 16字节,即128位HMAC密钥
'''
AES
CBC、BLOCK_SIZE=16、PKCS7填充
使用Crypto.Util.Padding中的pad和unpad函数进行PKCS7填充和去填充。这里使用块大小BLOCK_SIZE(16字节, 即128位)进行填充。
'''
# 加密函数
def encrypt_data(data: str) -> Tuple[str, str]:
cipher = AES.new(SECRET_KEY, AES.MODE_CBC) # AES.new()会自动生成一个随机IV并将其存储在cipher.iv中
ct_bytes = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size)) # BLOCK_SIZE = 16 # 128 bits、默认使用PKCS7填充
iv = base64.b64encode(cipher.iv).decode('utf-8')
ct = base64.b64encode(ct_bytes).decode('utf-8')
# 加密后的密文和IV会被编码并传输
return iv, ct
# 解密函数
def decrypt_data(iv: str, ct: str) -> str:
try:
iv = base64.b64decode(iv)
ct = base64.b64decode(ct)
cipher = AES.new(SECRET_KEY, AES.MODE_CBC, iv) # 使用CBC模式
pt = unpad(cipher.decrypt(ct), AES.block_size) # 使用PKCS7填充
return pt.decode('utf-8')
except (ValueError, KeyError):
return None
# HMAC生成函数
def generate_hmac(data: str) -> str:
return hmac.new(HMAC_KEY, data.encode('utf-8'), hashlib.sha256).hexdigest()
@app.route('/send', methods=['POST'])
def send_data():
content = request.json
data_str = json.dumps(content)
print('-----------------send=', data_str)
# 加密数据
iv, encrypted_data = encrypt_data(data_str)
# 生成HMAC
hmac_value = generate_hmac(encrypted_data)
response = {
'iv': iv,
'data': encrypted_data,
'hmac': hmac_value
}
return jsonify(response)
@app.route('/receive', methods=['POST'])
def receive_data():
content = request.json
iv = content.get('iv')
encrypted_data = content.get('data')
received_hmac = content.get('hmac')
# 验证HMAC
expected_hmac = generate_hmac(encrypted_data)
if not hmac.compare_digest(expected_hmac, received_hmac):
return jsonify({'error': 'HMAC verification failed'}), 400
# 解密数据
decrypted_data_str = decrypt_data(iv, encrypted_data)
if decrypted_data_str is None:
return jsonify({'error': 'Decryption failed'}), 400
# 将解密后的字符串反序列化为JSON对象
decrypted_data = json.loads(decrypted_data_str)
return jsonify({'data': decrypted_data})
if __name__ == '__main__':
app.run(debug=True)
我们来使用postman测试:
加密过程:
解密过程
如果您觉得我分享的这些对您有用,请点击原文,关注我吧