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. 项目中经常遇到的问题及处理办法
- http协议数据传输,需采用校验码技术或密码技术保证重要数据在传输过程中的完整性。
- 鉴别信息及重要业务数据采用经国家密码主管部门认可的密码技术,保证其在传输过程中数据的保密性。
**数据的保密性:**使用国家密码管理局认可的对称加密算法(如AES)来确保数据的保密性
**数据的完整性:**可以使用HMAC(哈希消息认证码)来确保数据在传输过程中的完整性
**AES(Advanced Encryption Standard,高级加密标准)**是一种对称加密算法,用于保护数据的安全。它被广泛应用于各种数据加密场景,包括文件加密、网络通信加密等。AES以其高效性和强大的安全性成为现代数据加密的主流选择。
**哈希消息认证码(HMAC)**是一种用于验证消息完整性和真实性的技术。它结合了哈希函数和密钥,确保消息在传输过程中未被篡改。
3. 处理的问题及处理的流程
- 请求、接收双方共用aes key及hmac key。
- 请求方在发送请求时,对发送的原始数据进行aes加密,并计算哈希值
- 接收方在接到数据后,进行哈希值验证,以确保数据完整性,之后进行aes解密处理
- 接收方根据解密后的数据进行各种业务处理,在返回给请求方时,将返回数据进行aes加密,并计算哈希值
- 请求方在接收到请求返回时,进行哈希验证并进行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 源码接口
-
对json进行加密(为了单独测试加密)
-
对加密数据进行解析(为了单独测试解密)
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服务商,…...

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 绘画的核心在于机器学习算法。通过训练大量的图像…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...