当前位置: 首页 > news >正文

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

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

  • 【深度学习】
    • 【深度学习】物体检测/分割/追踪/姿态估计/图像分类检测演示系统【含源码】
    • 【深度学习】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字符长度的字符串作为IVreturn ''.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_strdef 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 plaintextif __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.urlip_address = request.remote_addrif 'OPTIONS' == url_method:return Noneif 'GET' == url_method:return Noneif '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)# 验证HMACcalculate_hmac = generate_hmac(recv_data)if not hmac.compare_digest(calculate_hmac, recv_hmac):# 哈希消息验证码校验失败return jsonify({'error': 'HMAC verification failed'}), 400# 将修改后的数据重新赋值给request.datarequest._cached_data = body_strreturn 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.urlurl_method = request.method.upper()if 'OPTIONS' == url_method:return responseelif 'GET' == url_method:passelif '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())# 生成HMAChmac_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__)
'''
AESCBC、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 = 16def generate_iv_16str() -> str:# 生成一个16字符长度的字符串作为IVreturn ''.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_strdef 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.urlip_address = request.remote_addrprint(f'---------------------------------(starting:)server receive, method={url_method}, url={url_str}, remote_addr={ip_address}')if 'OPTIONS' == url_method:return Noneif 'GET' == url_method:return Noneif 'POST' != url_method:return None# 不需要任何验证的请求if url_str.find("/send") > 0 \or url_str.find("/receive") > 0 \or url_str.find("/login") > 0:return NonerequestData = 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.datarequest._cached_data = body_strreturn None# 定义中间件处理响应数据
def after_request_func(response):url_str = request.urlurl_method = request.method.upper()if 'OPTIONS' == url_method:return responseelif 'GET' == url_method:passelif 'POST' == url_method:pass# 不需要任何验证的请求if url_str.find("/send") > 0 \or url_str.find("/receive") > 0 \or url_str.find("/login") > 0:return responseresponse_json = response.get_json()# 加密数据data_str = json.dumps(response_json)encrypted_data, iv_str = encrypt_aes_str(data_str, SECRET_KEY, generate_iv_16str())# 生成HMAChmac_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 responseapp.before_request(before_request_func)
app.after_request(after_request_func)# 对json数据进行aes加密,并生成hmac
@app.route('/send', methods=['POST'])
def send_data():content = request.jsondata_str = json.dumps(content) # 将JSON对象序列化为字符串# 加密数据encrypted_data, iv_str = encrypt_aes_str(data_str, SECRET_KEY, generate_iv_16str())# 生成HMAChmac_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.jsoniv = content.get('vector')encrypted_data = content.get('data')received_hmac = content.get('code')# 验证HMACexpected_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数据传输确保完整性和保密性整流程方案(含源码)

往期文章回顾 【深度学习】 【深度学习】物体检测/分割/追踪/姿态估计/图像分类检测演示系统【含源码】【深度学习】YOLOV8数据标注及模型训练方法整体流程介绍及演示【深度学习】行人跌倒行为检测软件系统【深度学习】火灾检测软件系统【深度学习】吸烟行为检测软件系统【深度…...

UE插件与云渲染:10个提升效率的选择

Unreal Engine(虚幻引擎)的插件生态丰富多样,从提升视觉效果到优化工作流程,为开发者提供了无限扩展的可能。本文推荐10款备受欢迎的插件,助你激发创意,提升开发效率. 一、地牢建筑师:程序化关…...

[Shell编程学习路线]——shell脚本中case语句多分支选择详解

🏡作者主页:点击! 🛠️Shell编程专栏:点击! ⏰️创作时间:2024年6月21日16点30分 🀄️文章质量:95分 ————前言———— 在Shell编程中,处理多种条件…...

Django REST Framework(四)DRF Serializer

作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型 3. 反序列化,完成数据校验功能 定义序列化器 Django REST framework中的Serializer使用类来定义&a…...

【C语言】bool 关键字

在C语言中,bool类型用于表示布尔值,即真或假。C语言本身在标准库中并未提供布尔类型,直到C99标准引入了stdbool.h头文件。该头文件定义了bool类型,以及两个常量:true和false。在此之前,通常使用整数来表示布…...

开发电商ERP系统需要接入哪些平台API?

跟随全渠道发展趋势,很多实体商家开设电商店铺,为消费者提供便捷的购物体验,增强消费者的满意度,同时也提升了企业自身的市场竞争力。为了满足商家业务拓展需求,很多原本主要服务于实体商贸企业的ERP服务商&#xff0c…...

Meet AI4S 直播预告丨房价分析新思路:神经网络直击复杂地理环境中的空间异质性

近年来,房地产市场起起落落,房价已经成为了扰动居民幸福感的重要影响因素。大多数家庭都需要面对「买不买房、何时买房、在哪儿买房、买什么房」的艰难抉择,每一个问题的答案都在某种程度上与房价的波动息息相关。 近年来,我国各…...

支持向量机(SVM)在机器学习中的简单示例

目录 工作原理 核函数 SVM用于分类 结果分析 结论 ❤❤❤动动发财的小手点点赞点点关注哦~~~❤❤❤ 支持向量机是一种强大的监督学习模型,用于分类和回归任务。它通过找到数据点之间的最优边界来区分不同的类别。SVM特别适用于那些具有清晰边界但线性不可分的…...

使用Anaconda虚拟环境安装Opencv、pytorch、torchvision踩坑记录

电脑 python 环境版本过高与下载Opencv(3.4以下)不匹配,因为版本过高部分算法收米, 从而在虚拟环境重新下载python老版本 本文默认您的电脑上已经安装了Anaconda 我是按照这位博文安装的 安装Opencv (详解)安装3.4.1.15版本…...

【人工智能】CPU、GPU与TPU:人工智能领域的核心处理器概述

在人工智能和计算技术的快速发展中,CPU(中央处理器)、GPU(图形处理器)和TPU(张量处理器)作为核心处理器,各自扮演着不可或缺的角色。它们不仅在性能上各有千秋,还在不同的…...

【康复学习--LeetCode每日一题】3099. 哈沙德数

题目: 如果一个整数能够被其各个数位上的数字之和整除,则称之为 哈沙德数(Harshad number)。给你一个整数 x 。如果 x 是 哈沙德数 ,则返回 x 各个数位上的数字之和,否则,返回 -1 。 示例 1&a…...

docker使用jdk21启动jar包报错

[0.007s][warning][os,thread] Failed to start thread "GC Thread#0" - pthread_create failed (EPERM) for attributes: stacksize: 1024k, guardsize: 4k, detached. [0.007s][error ][gc,task ] Failed to create worker thread解决办法 1 (使用doc…...

Object 类中的公共方法详解

Object 类中的公共方法详解 1、clone() 方法2、equals(Object obj) 方法3、hashCode() 方法4、getClass() 方法5、wait() 方法6、notify() 和 notifyAll() 方法 💖The Begin💖点点关注,收藏不迷路💖 在 Java 中,Object…...

python 字典 一个key 多 value 遍历

在Python中,如果一个键对应多个值,你需要确保这些值被存储在一个容器类型(如列表或集合)中。你可以使用默认字典(collections.defaultdict)来简化这个过程。以下是一个示例代码: from collecti…...

vue---基本原理(二)

1、slot的基础理解 slot又名插槽,是vue的内容分发机制,组件内部的模板引擎使用slot元素作为承载分发的出口。是子组件的一个模板标签元素,而这一个标签元素是否显示,以及怎么显示,是由父元素控制的。slot又分为默认插槽…...

桂花网蓝牙网关X1000:引领物联网新时代的智能连接

在物联网技术飞速发展的今天,蓝牙网关作为连接蓝牙设备与互联网的关键设备,其性能与稳定性直接影响到物联网系统的整体运行效果。桂花网蓝牙网关X1000凭借其卓越的性能和广泛的应用场景,成为了物联网领域的佼佼者。 一、产品概述 桂花网蓝牙…...

JAVA案例模拟电影信息系统

一案例要求: 二具体代码(需要在同一个包下创建三个类) Ⅰ:实现类 package 重修;import java.util.Random; import java.util.Scanner;public class first {public static void main(String[] args) {javabean[]moviesnew javabean[4];movies[0] new ja…...

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务10:Hive安装部署

任务描述 任务内容为安装并配置在Hadoop集群中使用Hive。 任务指导 Hive是一个基于Hadoop的数据仓库框架,在实际使用时需要将元数据存储在数据库中 具体安装步骤如下: 1. 安装MySQL数据库(已安装) 2. 解压缩Hive的压缩包 3…...

第一百四十二节 Java数据类型教程 - Java字符数据类型

Java数据类型教程 - Java字符数据类型 Character类的一个对象包装一个char值。 字符类包含isLetter()和isDigit()方法来检查字符是否为字母和数字。 toUpperCase()和toLowerCase()方法将字符转换为大写和小写。 该类提供了一个构造函数和一个工厂valueOf()方法来从char创建对…...

AI 绘画的常用技巧和操作方法

随着人工智能技术的飞速发展,AI 绘画已经成为设计和艺术领域的一股新兴力量。无论是设计师、艺术家,还是普通的科技爱好者,都能通过 AI 绘画工具创造出令人惊叹的作品。 AI 绘画的基本原理 AI 绘画的核心在于机器学习算法。通过训练大量的图像…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

pam_env.so模块配置解析

在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

条件运算符

C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...