http数据传输确保完整性和保密性整流程方案(含源码)

news2025/1/17 4:06:31

在这里插入图片描述
往期文章回顾

  • 【深度学习】
    • 【深度学习】物体检测/分割/追踪/姿态估计/图像分类检测演示系统【含源码】
    • 【深度学习】YOLOV8数据标注及模型训练方法整体流程介绍及演示
    • 【深度学习】行人跌倒行为检测软件系统
    • 【深度学习】火灾检测软件系统
    • 【深度学习】吸烟行为检测软件系统
    • 【深度学习】数竹签演示软件系统
    • 【深度学习】菜品目标检测软件系统
  • 【爬虫】
    • 爬取A股数据写入数据库(一)
    • 爬取A股数据写入数据库(二)
    • 爬取股票历史K线数据写入数据库(三)
    • 爬取股票数据写入数据库并显示(四)
  • 【QT】
    • QT5集成FTP实现文件及文件夹的下载
    • QT集成开源日志库示例
  • 【Python源码加密】
    • python源码加密之Cython方案简单示例
    • Cython针对python工程多层级目录处理办法
  • 【数据安全】
    • http服务网络请求如何确保数据安全(含python示例源码)
    • http数据传输确保完整性和保密性全整流程方案(含源码)

1. 本文摘要

  • 当今数据安全越来越重要,http网络请求数据安全加强要求是为了保护公民的隐私和数据安全,防范日益复杂的网络攻击,确保电子商务和在线服务的可靠性,并遵守相关法律法规。
  • 上一篇文章中,结合我参与的项目,粗略描述了在http网络请求中如何做到数据安全,并附了一些源码
  • 本文主要介绍"http请求中数据传输的完整性和传输过程中数据的保密性",这部分如何快速融入到已有的工程中,包括中间件转发,这样就可以无缝的连接到原来的项目中。
  • 本文仍然使用python flask来演示整个过程,并详细描述了这个过程的设计流程。
    本系统所涉及的源码已打包上传。
    文中源码文件【获取方式】:关注公众号:利哥AI实例探险
    给公众号发送 “http传输安全保密” 获取下载方式
    注意发送的关键词不能错,否则匹配不到对应资源,由于本人能力有限,难免有疏漏之处。

2. 项目中经常遇到的问题及处理办法

  1. http协议数据传输,需采用校验码技术或密码技术保证重要数据在传输过程中的完整性。
  2. 鉴别信息及重要业务数据采用经国家密码主管部门认可的密码技术,保证其在传输过程中数据的保密性。

**数据的保密性:**使用国家密码管理局认可的对称加密算法(如AES)来确保数据的保密性
**数据的完整性:**可以使用HMAC(哈希消息认证码)来确保数据在传输过程中的完整性

**AES(Advanced Encryption Standard,高级加密标准)**是一种对称加密算法,用于保护数据的安全。它被广泛应用于各种数据加密场景,包括文件加密、网络通信加密等。AES以其高效性和强大的安全性成为现代数据加密的主流选择。
**哈希消息认证码(HMAC)**是一种用于验证消息完整性和真实性的技术。它结合了哈希函数和密钥,确保消息在传输过程中未被篡改。

3. 处理的问题及处理的流程

  1. 请求、接收双方共用aes key及hmac key。
  2. 请求方在发送请求时,对发送的原始数据进行aes加密,并计算哈希值
  3. 接收方在接到数据后,进行哈希值验证,以确保数据完整性,之后进行aes解密处理
  4. 接收方根据解密后的数据进行各种业务处理,在返回给请求方时,将返回数据进行aes加密,并计算哈希值
  5. 请求方在接收到请求返回时,进行哈希验证并进行aes解密,并进行业务处理
    在这里插入图片描述

4. 示例代码拆解

4.1 AES加解密

文章末尾会附带全部源码,以下为讲解
加密函数:

  • 输入:需要加密的原始数据字符串、aes key、随机生成的iv
  • 输出:加密后的数据串、随机生成的iv(供数据发送给接收方进行解密使用)

解密函数:

  • 输入:加密后的数据字符串、aes key、加密时的iv
  • 输出:解密后的原始数据
def generate_iv_16str() -> str:
    # 生成一个16字符长度的字符串作为IV
    return ''.join(random.choices(string.ascii_letters + string.digits, k=BLOCK_SIZE))

def encrypt_aes_str(plaintext, key, iv_str) -> Tuple[str, str]:
    # 将IV字符串转换为字节
    iv = iv_str.encode('utf-8')
    # 创建AES对象
    cipher = AES.new(key, AES.MODE_CBC, iv)
    # 加密并进行填充
    ciphertext = cipher.encrypt(pad(plaintext.encode('utf-8'), BLOCK_SIZE))
    # 将密文进行Base64编码
    encrypted_data = base64.b64encode(ciphertext).decode('utf-8')
    return encrypted_data, iv_str

def decrypt_aes_str(ciphertext: str, key: str, iv_str: str) -> str:
    # 将IV字符串转换为字节
    iv = iv_str.encode('utf-8')
    # 将密文解码为字节数组
    ciphertext = base64.b64decode(ciphertext)
    # 创建AES对象
    cipher = AES.new(key, AES.MODE_CBC, iv)
    # 解密并去除填充
    plaintext = unpad(cipher.decrypt(ciphertext), BLOCK_SIZE)
    return plaintext
    
if __name__ == '__main__':
    # 加密数据
    response_json = {"msg": "hello world"}
    data_str = json.dumps(response_json)
    # 加密
    encrypted_data, iv_str = encrypt_aes_str(data_str, SECRET_KEY, generate_iv_16str())
    # 解密
    body_str = decrypt_aes_str(encrypted_data, SECRET_KEY, iv_str)

4.2 哈希验证码生成

输入:加密后的字符串
输出:哈希验证码

# HMAC生成函数
def generate_hmac(data: str) -> str:
    return hmac.new(HMAC_KEY, data.encode('utf-8'), hashlib.sha256).hexdigest()

4.3 中间件处理

中间件前置处理函数:

  • 在中间件中解析数据,做数据完整性的哈希码认证
  • 在中间件中根据iv解析aes加密后的数据,再将这部分数据写入到中间件,供视图函数使用
  • 在视图函数中,进行业务处理
app = Flask(__name__)
app.before_request(before_request_func)
app.after_request(after_request_func)

def before_request_func():
    url_method = request.method.upper()
    url_str = request.url
    ip_address = request.remote_addr
    if 'OPTIONS' == url_method:
        return None
    if 'GET' == url_method:
        return None
    if 'POST' != url_method:
        return None    
    requestData = request.get_json()
    recv_iv = requestData.get('vector')
    recv_hmac = requestData.get('code')
    recv_data = requestData.get('data')
    body_str = decrypt_aes_str(recv_data, SECRET_KEY, recv_iv)
    # 验证HMAC
    calculate_hmac = generate_hmac(recv_data)
    if not hmac.compare_digest(calculate_hmac, recv_hmac):
        # 哈希消息验证码校验失败
        return jsonify({'error': 'HMAC verification failed'}), 400
    # 将修改后的数据重新赋值给request.data
    request._cached_data = body_str
    return None

中间件后置处理函数:

  • 视图函数处理完业务逻辑后,会将返回结果返回到中间件
  • 中间件需要对返回数据进行加密,再带上iv进行返回
app = Flask(__name__)
app.before_request(before_request_func)
app.after_request(after_request_func)
   
def after_request_func(response):
    url_str = request.url
    url_method = request.method.upper()
    if 'OPTIONS' == url_method:
        return response
    elif 'GET' == url_method:
        pass
    elif 'POST' == url_method:
        pass    
    response_json = response.get_json()
    # 加密数据
    data_str = json.dumps(response_json)
    encrypted_data, iv_str = encrypt_aes_str(data_str, SECRET_KEY, generate_iv_16str())
    # 生成HMAC
    hmac_value = generate_hmac(encrypted_data)
    response_data = {
        'vector': iv_str,
        'data': encrypted_data,
        'code': hmac_value
    }
    response.data = json.dumps(response_data)
    response.mimetype = 'application/json'
    return response

5. 整体代码示例及逻辑

5.1 整体源码

from flask import Flask, request, jsonify
import hmac, hashlib, base64, json, string, random
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from typing import Tuple
app = Flask(__name__)
'''
AES
    CBC、BLOCK_SIZE=16、PKCS7填充
    使用Crypto.Util.Padding中的pad和unpad函数进行PKCS7填充和去填充。这里使用块大小BLOCK_SIZE(16字节, 即128位)进行填充。
    偏移量 (IV) 的长度是有要求的。
    对于AES (高级加密标准) 来说, IV的长度必须与AES的块大小相同, 这意味着IV的长度必须是16字节(128位),因为AES的块大小是128位。
'''
# 配置参数
# 共享密钥和HMAC密钥
SECRET_KEY = b'synjones2024zhc1'  # 16字节,即128位密钥  确保是16个字符, 避免引起不必要的异常
HMAC_KEY = b'synjones2024zhc2'  # 16字节,即128位HMAC密钥
BLOCK_SIZE = 16

def generate_iv_16str() -> str:
    # 生成一个16字符长度的字符串作为IV
    return ''.join(random.choices(string.ascii_letters + string.digits, k=BLOCK_SIZE))

def encrypt_aes_str(plaintext: str, key: str, iv_str: str) -> Tuple[str, str]:
    # 将IV字符串转换为字节
    iv = iv_str.encode('utf-8')
    # 创建AES对象
    cipher = AES.new(key, AES.MODE_CBC, iv)
    # 加密并进行填充
    ciphertext = cipher.encrypt(pad(plaintext.encode('utf-8'), BLOCK_SIZE))
    # 将密文进行Base64编码
    encrypted_data = base64.b64encode(ciphertext).decode('utf-8')
    return encrypted_data, iv_str

def decrypt_aes_str(ciphertext: str, key: str, iv_str: str) -> str:
    # 将IV字符串转换为字节
    iv = iv_str.encode('utf-8')
    # 将密文解码为字节数组
    ciphertext = base64.b64decode(ciphertext)
    # 创建AES对象
    cipher = AES.new(key, AES.MODE_CBC, iv)
    # 解密并去除填充
    plaintext = unpad(cipher.decrypt(ciphertext), BLOCK_SIZE)
    return plaintext

# HMAC生成函数
def generate_hmac(data: str) -> str:
    return hmac.new(HMAC_KEY, data.encode('utf-8'), hashlib.sha256).hexdigest()

# 定义中间件处理请求数据
def before_request_func():
    url_method = request.method.upper()
    url_str = request.url
    ip_address = request.remote_addr
    print(f'---------------------------------(starting:)server receive, method={url_method}, url={url_str}, remote_addr={ip_address}')
    if 'OPTIONS' == url_method:
        return None
    if 'GET' == url_method:
        return None
    if 'POST' != url_method:
        return None
    
    # 不需要任何验证的请求
    if url_str.find("/send") > 0 \
        or url_str.find("/receive") > 0 \
        or url_str.find("/login") > 0:
        return None
    
    requestData = request.get_json()
    recv_iv = requestData.get('vector')
    recv_hmac = requestData.get('code')
    recv_data = requestData.get('data')
    body_str = decrypt_aes_str(recv_data, SECRET_KEY, recv_iv)
    print('-------------body_str=', body_str)
    # 验证HMAC
    # calculate_hmac = generate_hmac(recv_data)
    # if not hmac.compare_digest(calculate_hmac, recv_hmac):
    #     # 哈希消息验证码校验失败
    #     return jsonify({'error': 'HMAC verification failed'}), 400
    # 将修改后的数据重新赋值给request.data
    request._cached_data = body_str
    return None

# 定义中间件处理响应数据
def after_request_func(response):
    url_str = request.url
    url_method = request.method.upper()
    if 'OPTIONS' == url_method:
        return response
    elif 'GET' == url_method:
        pass
    elif 'POST' == url_method:
        pass
    
        # 不需要任何验证的请求
    if url_str.find("/send") > 0 \
        or url_str.find("/receive") > 0 \
        or url_str.find("/login") > 0:
        return response
    
    response_json = response.get_json()
    # 加密数据
    data_str = json.dumps(response_json)
    encrypted_data, iv_str = encrypt_aes_str(data_str, SECRET_KEY, generate_iv_16str())
    # 生成HMAC
    hmac_value = generate_hmac(encrypted_data)
    response_data = {
        'vector': iv_str,
        'data': encrypted_data,
        'code': hmac_value
    }
    response.data = json.dumps(response_data)
    response.mimetype = 'application/json'
    return response

app.before_request(before_request_func)
app.after_request(after_request_func)

# 对json数据进行aes加密,并生成hmac
@app.route('/send', methods=['POST'])
def send_data():
    content = request.json
    data_str = json.dumps(content) # 将JSON对象序列化为字符串
    # 加密数据
    encrypted_data, iv_str = encrypt_aes_str(data_str, SECRET_KEY, generate_iv_16str())
    # 生成HMAC
    hmac_value = generate_hmac(encrypted_data)
    response = {
        'vector': iv_str,
        'data': encrypted_data,
        'code': hmac_value
    }
    return jsonify(response)

# 对aes加密的数据进行hmac验证,并解析aes加密的数据
@app.route('/receive', methods=['POST'])
def receive_data():
    content = request.json
    iv = content.get('vector')
    encrypted_data = content.get('data')
    received_hmac = content.get('code')

    # 验证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_aes_str(encrypted_data, SECRET_KEY, iv)
    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})

@app.route('/encrypt', methods=['POST'])
def encrypt():
    j_data = json.loads(request.data)
    print('-------------路由接收:', j_data)
    return jsonify(j_data)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

5.2 源码接口

  1. 对json进行加密(为了单独测试加密)
    在这里插入图片描述

  2. 对加密数据进行解析(为了单独测试解密)

在这里插入图片描述
3. 使用中间件流程(对应整体流程),即流程设计图中的流程,此接口是可以提供给请求端调用的接口
在这里插入图片描述

如果您觉得我分享的这些对您有用,请点击原文,关注我吧

原文地址:http数据传输确保完整性和保密性整流程方案(含源码)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1895115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

element-ui el-select选择器组件下拉框增加自定义按钮

element-ui el-select选择器组件下拉框增加自定义按钮 先看效果 原理&#xff1a;在el-select下添加禁用的el-option&#xff0c;将其value绑定为undefined&#xff0c;然后覆盖el-option禁用状态下的默认样式即可 示例代码如下&#xff1a; <template><div class…

Maxwell 数据采集工具详解

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 欢迎关注微信公众号&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&a…

修改头文件版本需要修改的文件

以修改ui的头文件版本为例&#xff0c;还需要同时更新 PJ10PC20240120041_c928\components\master-t5\hikauto\module\app\include PJ10PC20240120041_c928\components\master-t5\hikauto\module\app\include\dsp PJ10PC20240120041_c928\components\master-t5\hikauto\incl…

文华财经T8多空量化交易策略模型源码

//定义变量 N : 3; // 连续K线数量&#xff08;可根据需要调整&#xff09; Q : 0.05; // 止盈比例5%&#xff08;可根据需要调整&#xff09; HIGH_PRICE : REF(HIGH, 1); // 记录前根阳线的最高价 LOW_PRICE : REF(LOW, 1); // 记录前根阴线的最低价 //做多策略 REF(EV…

开发国际短剧系统的策略解析

一、明确项目目标和需求 1、功能需求&#xff1a;确定系统应具备的基本功能&#xff0c;如用户注册、登录、浏览短剧、评论、分享、个性化推荐等。 2、性能需求&#xff1a;确保系统能够承受高并发访问&#xff0c;保证视频流畅播放&#xff0c;减少卡顿和延迟。 3、跨文化传播…

Redis基础教程(四):redis键(key)

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

TCL中环可转债缩水近90亿:业绩持续承压,百亿自有资金购买理财

《港湾商业观察》廖紫雯 日前&#xff0c;TCL中环新能源科技股份有限公司&#xff08;以下简称&#xff1a;TCL中环&#xff0c;002129.SZ&#xff09;可转债总额缩水近90亿&#xff0c;引发市场关注。可转债大幅缩水的另一面&#xff0c;公司此前发布公告披露将使用百亿自有资…

内网渗透学习-杀入内网

1、靶机上线cs 我们已经拿到了win7的shell&#xff0c;执行whoami&#xff0c;发现win7是administrator权限&#xff0c;且在域中 执行ipconfig发现了win7存在内网网段192.168.52.0/24 kali开启cs服务端 客户端启动cs 先在cs中创建一个监听器 接着用cs生成后门&#xff0c;记…

3d打开模型的时候怎么没有灯光?---模大狮模型网

在3D建模与渲染过程中&#xff0c;灯光是至关重要的元素之一&#xff0c;直接影响到最终场景的视觉效果和真实感。然而&#xff0c;有时打开3D模型时可能会发现缺乏适当的灯光设置&#xff0c;这会导致场景显得暗淡或平淡无奇。本文将探讨为何在打开3D模型时可能没有灯光的原因…

【论文速读】|FuzzAug:探索模糊测试作为神经网络测试生成的数据增强

本次分享论文&#xff1a;FuzzAug: Exploring Fuzzing as Data Augmentation for Neural Test Generation 基本信息 原文作者&#xff1a;Yifeng He, Jicheng Wang, Yuyang Rong, Hao Chen 作者单位&#xff1a;University of California, Davis 关键词&#xff1a;软件测试…

springboot 篮球馆管理系统-计算机毕业设计源码21945

目 录 摘要 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 篮球馆管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

分子AI预测赛笔记

#AI夏令营 #Datawhale #夏令营 Taks1 跑通baseline 根据task1跑通baseline 注册账号 直接注册或登录百度账号&#xff0c;etc fork 项目 零基础入门 Ai 数据挖掘竞赛-速通 Baseline - 飞桨AI Studio星河社区 启动项目 选择运行环境&#xff0c;并点击确定&#xff0c;没…

因果推断前沿研究方向都在这了!

【因果推断】是研究如何从观测数据中识别和估计变量之间因果关系的领域。它在医学、经济学、环境科学等多个领域有着广泛的应用&#xff0c;帮助科学家和决策者理解复杂现象背后的因果机制。通过使用统计方法、机器学习技术以及逻辑推理&#xff0c;因果推断能够揭示变量间的潜…

Frrouting快速入门——OSPF组网(一)

FRR简介 FRR是FRRouting的简称&#xff0c;是一个开源的路由交换软件套件。其作者源自老牌项目quaga的成员&#xff0c;也可以算是quaga的新版本。 使用时一般查看此文档&#xff1a;https://docs.frrouting.org/projects/dev-guide/en/latest/index.html FRR支持的协议众多…

Objection 对命令的批量操作

假定现在需要对好多不同的类进行批量hook&#xff0c;逐个hook非常繁琐&#xff0c;那么可以要将这些hook的类放到一个文件里&#xff0c;并且在这些类的前面加上hook命令&#xff0c;内容如下 使用如下命令执行该文件中的命令 objection -g 测试 explore -c d:/hookData/toHoo…

go sync包(五) WaitGroup

WaitGroup sync.WaitGroup 可以等待一组 Goroutine 的返回&#xff0c;一个比较常见的使用场景是批量发出 RPC 或者 HTTP 请求&#xff1a; requests : []*Request{...} wg : &sync.WaitGroup{} wg.Add(len(requests))for _, request : range requests {go func(r *Reque…

深入解读:如何解决微调扩散模型时微调数据集和训练数据集之间的差距过大问题?

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;在微调扩散模型的时候经常会遇到微调数据集和训练数据集之间的差距过大&#xff0c;导致训练效果很差。在图像生成任务中并不明显&#xff0c;但是在视频生成任务中这个问题非常突出。这篇博客深入解读如何…

采用B/S模式 可跨平台使用的数据采集监控平台!

数据采集监控平台是一款专注于工业企业生产设备管理、数据采集、数据分析、数据管理、数据存储、数据传输等的软件系统。系统具备丰富的接口&#xff0c;配置灵活&#xff0c;方便部署&#xff0c;通过采集企业生产设备的数据集中处理&#xff0c;将各个信息孤岛有机连接&#…

2024年上半年数据泄露风险态势报告-百度网盘下载

在快速崛起的数字经济时代&#xff0c;数据作为企业的核心资产及重要战略资源&#xff0c;在高速增长的同时&#xff0c;其背后的数据风险也在不断攀升&#xff0c;日渐复杂的数据泄露形势&#xff0c;已成为企业数字化发展赛道的严重阻碍。 《2024年上半年数据泄露风险态势报…

MySQL 8.0 架构 之 中继日志(Relay log)

文章目录 MySQL 8.0 架构 之 中继日志&#xff08;Relay log&#xff09;中继日志&#xff08;Relay log&#xff09;概述相关参数参考 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 来源|WaltSQL和数据库技术(ID:SQLplusDB) MySQL 8.0 OCP …