http服务网络请求如何确保数据安全(含python示例源码)

news2024/11/27 6:15:40

在这里插入图片描述
深度学习类文章回顾
【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】
【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】
【深度学习】YOLOV8数据标注及模型训练方法整体流程介绍及演示
【深度学习】行人跌倒行为检测软件系统
【深度学习】火灾检测软件系统
【深度学习】吸烟行为检测软件系统
【深度学习】数竹签演示软件系统
【深度学习】菜品目标检测软件系统

本文链接:http服务网络请求如何确保数据安全(含python示例源码)

1. 本文摘要

  • 当今数据安全越来越重要,http网络请求数据安全加强要求是为了保护公民的隐私和数据安全,防范日益复杂的网络攻击,确保电子商务和在线服务的可靠性,并遵守相关法律法规。
  • 当前我参与的各类项目,均有安全检测,例如经常检测出的一些问题
    • http协议数据传输,需采用校验码技术或密码技术保证重要数据在传输过程中的完整性
    • 鉴别信息及重要业务数据采用经国家密码主管部门认可的密码技术,保证其在传输过程中数据的保密性。
  • 本文主要介绍在http的传输过程中如何保证数据安全,即:如何确保http请求中数据传输的完整性和传输过程中数据的保密性。
  • 本文主要使用python flask来演示整个过程。
    本系统所涉及的源码已打包上传。
    文中源码文件【获取方式】:关注公众号:利哥AI实例探险
    给公众号发送 “http传输安全保密” 获取下载方式
    注意发送的关键词不能错,否则匹配不到对应资源,由于本人能力有限,难免有疏漏之处。

2. 实际项目中经常遇到的问题

一般情况下,在我们交付完甲方软件系统后,甲方都会请专业的团队进行漏洞检测,出具《xxx系统漏洞检测报告》,这其中我们经常会遇到的问题如下:

  1. http协议数据传输,需采用校验码技术或密码技术保证重要数据在传输过程中的完整性。
  2. 鉴别信息及重要业务数据采用经国家密码主管部门认可的密码技术,保证其在传输过程中数据的保密性。
    本文只针对这两类问题,给出一些优化建议。

3. 解决方案

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

3.1 AES是如何保证数据的保密性的

AES(高级加密标准)对称加密通过以下方式保证数据的保密性:

  1. 密钥唯一性: AES使用一个唯一的对称密钥,这个密钥必须在发送方和接收方之间保持秘密。如果密钥泄露,任何人都可以解密数据。
  2. 复杂加密算法: AES算法通过多轮替换和置换操作,将明文数据转换成密文,使得密文难以被破解。
  3. 初始向量(IV): 在CBC模式中,AES使用一个随机生成的初始向量(IV)进行加密,使相同的明文每次加密得到不同的密文,从而增强了安全性。
  4. 密钥长度: AES支持128位、192位和256位密钥长度,密钥越长,破解难度越大。
    通过以上机制,AES确保了数据在传输过程中的保密性,即使数据被截获,未经授权的一方也无法解密和理解数据。

3.2 随机生成的IV(初始化向量)是如何确保加密的安全性的

  1. 防止相同明文产生相同密文: 如果使用相同的密钥加密相同的明文,但没有随机IV,那么每次加密的结果将是相同的。这使得攻击者更容易识别和分析重复的模式,从而破坏加密的安全性。随机IV确保即使明文相同,生成的密文也不同。
  2. 增强密码学强度: IV的随机性增加了加密算法的复杂性,使得攻击者更难以破解。每次加密时生成新的随机IV,确保没有重复,增加了攻击者的工作量。
  3. 确保初始加密块的随机性: 在使用块加密模式(如CBC模式)时,IV用于加密第一个块。随机IV确保初始块的加密是不可预测的,进一步增强了加密的安全性。
  4. 防止重放攻击: 在某些情况下,攻击者可能会截获加密的消息并重放它们。使用随机IV确保每个加密会话都是唯一的,从而防止重放攻击。

3.3 哈希消息认证码是如何确保数据传输完整性的

  1. 哈希函数: HMAC使用一个密码学哈希函数(如SHA-256),将数据和密钥混合生成一个唯一的哈希值。
  2. 密钥保护: HMAC结合了一个秘密密钥,仅持有该密钥的接收方才能验证数据的完整性,防止中间人篡改数据。
  3. 签名生成和验证: 发送方在数据传输前计算HMAC并附加到数据上,接收方接收到数据后重新计算HMAC并与传来的HMAC值对比,如果一致,则数据完整无误。

除了使用随机IV确保加密的安全性,还结合了HMAC来确保数据的完整性。每次加密的结果都包含IV和HMAC,接收方使用这些信息验证数据的完整性和解密数据,确保传输过程中的数据既安全又完整。
通过随机IV和HMAC的结合,我们可以实现一个安全的加密传输系统,防止数据被攻击者篡改或重放,确保数据在传输过程中的安全性和完整性。

4. 代码实现示例

  1. 使用aes加密, AES.new()会自动生成一个随机IV并将其存储在cipher.iv中,SECRET_KEY如果是128位,需要确保是16个字符, 避免引起不必要的异常。这里我们使用的是AES:CBC、BLOCK_SIZE=16、PKCS7填充
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
  1. 使用aes解密
# 解密函数
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()

接下来我们来设计整个流程:

  • 加密:使用AES对称加密算法进行数据加密,使用随机生成的IV(初始化向量)确保加密的安全性。
  • 解密:解密时使用传递过来的IV和加密数据。
  • HMAC:使用HMAC-SHA256算法生成消息认证码,确保数据在传输过程中的完整性。使用HMAC进行验证,如果验证失败则返回错误。
  • 数据传输:加密后的数据、IV和HMAC值通过JSON格式进行传输。
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测试:
加密过程:
在这里插入图片描述
解密过程
在这里插入图片描述

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

原文链接:http服务网络请求如何确保数据安全(含python示例源码),关注获取更多内容!

在这里插入图片描述

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

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

相关文章

命令行中关于windows hash md5 , mac hash md5 , linux hash md5 文件校验方式

md5, sha-1 ,sha256. windows certutil -hashfile filename md5certutil -hashfile filename sha1certutil -hashfile filename sha256macos 平台 md5 filenameshasum -a 1 filenameshasum -a 256 filenamelinux 平台 md5sum filenameshasum -a 1 fil…

菜籽桌面4.5.0~4.5.1常见问题解答

目录 如何刷机? 刷机失败? 无法方控? 无法画中画? 原车音乐跟我安装的音乐一起播放? 原车音乐停了,我安装的软件也跟着没声音了? 调节声音时忽大忽小? 怎么安装软件? 软件…

spring boot (shiro)+ websocket测试连接不上的简单检测处理

1、用前端连接测试的demo一切正常,但是到了项目中连接不上了 一开始以为是地址错,但是换了apifox测试也是不可以。 2、考虑是shiro进行了拦截了,所以就访问不到了地址,那么就放行。 3、再次用apifox测试,成功了。 当然…

Halcon 如何让图像自适应窗口

一 如何让图像自适应窗口 read_image(Image,1)get_image_size(Image,Width, Height)dev_close_window()dev_open_window(0,0,Width/2,Height/2,black,WindowHandle)dev_set_part(0,0,Height-800,Width-800)dev_display(Image)二 如何实现彩色图像转化为灰色图像 read_image(I…

Java nio 的线程通信机制线程通信Pipe

Java的Pipe是一种新的线程通信机制,传统的线程通信可以是通过共享内存的方式,socket等方式,而Pipe是通过Java NIO 通信的方式实现共享内存,优点类似于go语言的管道 先上代码 public static void main(String[] args) throws IOEx…

国外的Claude3.5 Sonnet Artifacts和国内的CodeFlying孰强孰弱?

在Claude 3.5 Sonnet发布后,最受大家关注的问题应该就是它在编写代码能力上的变化。 要知道在Claude3.0发布以来的这几个月就因为它的编写代码能力而一直受到人们的诟病。 那Anthropic这次终于是不负众望,在Claude 3.5 Sonnet中更新了一个叫做Artifact…

.net core 的 winform 的 浏览器控件 WebView2

在.NET Core WinForms应用程序中,没有直接的“浏览器控件”,因为WinForms不支持像WebBrowser控件那样的功能。但是,你可以使用WebView2控件,它是一个基于Chromium的浏览器内核,可以在WinForms应用程序中嵌入Web内容。 …

用英文介绍芝加哥(1):Making Modern Chicago Part 1 Building a Boomtown

Making Modern Chicago | Part 1: Building a Boomtown Link: https://www.youtube.com/watch?vpNdX0Dm-J8Y&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index4 Summary Summary of Chicago’s History and Development Urban Planning and Growth Chicago, often r…

新手入门爬虫:从零开始,轻松掌握网络数据采集技术(有实战)

在互联网高速发展的今天,数据已经成为了各行各业的重要资源。而爬虫作为一种特殊的程序,可以帮助我们快速地获取到大量的数据。本文将从零开始,带领大家了解爬虫的基本概念、原理以及实践操作,帮助新手轻松掌握网络数据采集技术。…

浅谈逻辑控制器之Switch控制器

浅谈逻辑控制器之Switch控制器 Switch Controller是Apache JMeter中一个强大的逻辑控制器,它允许用户基于特定的变量值或参数来控制哪些子采样器被执行。与简单地按照配置顺序执行的控制器不同,Switch Controller根据提供的“switch value”来决定执行哪…

行业推荐!IG5216量产工具下载,IG5216开卡软件分享

国内固态硬盘常用,且有量产工具流传出来的主控厂商包括慧荣、群联、点序、英韧、得一微、瑞昱、联芸、迈威、国科、华澜微等等。 每个主控需要用各自对应的量产工具,不同的量产工具支持的闪存颗粒也有差异,因此要根据固态硬盘实际的主控型号…

Charles抓包工具系列文章(三)-- 接口映射工具(Map Remote和Map Local)

一、背景 前文的http请求都是静态的,像compose a new request,仅适用于接口的自测。 回放repeat 一个 http 请求,也无法做到动态调试。 这里的动态还是静态,是站在客户端的角度,数据是实时的,可调试的。 …

【R语言】plot输出窗口大小的控制

如果需要输出png格式的图片并设置dpi,可采用以下代码 png("A1.png",width 10.09, height 10.35, units "in",res 300) 为了匹配对应的窗口大小,在输出的时候保持宽度和高度一致即可,步骤如下: 如上的“10…

Verilog进行结构描述(四):Verilog逻辑强度(strength)模型

目录 1.Verilog提供多级逻辑强度。2.基本单元强度说明语法3.信号强度值系统4.Verilog多种强度决断 微信公众号获取更多FPGA相关源码: 1.Verilog提供多级逻辑强度。 逻辑强度模型决定信号组合值是可知还是未知的,以更精确的描述硬件的行为。下面这些情…

【ONLYOFFICE深度探索】:ONLYOFFICE桌面编辑器8.1震撼发布,打造高效办公新境界

文章目录 一、功能完善的PDF编辑器:解锁文档处理新维度二、幻灯片版式设计:释放创意,打造专业演示三、改进从右至左显示:尊重多元文化,优化阅读体验四、新增本地化选项:连接全球用户,跨越语言障…

Redis--18--Redis Desktop Manage下载与安装

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Redis Desktop Manage1.官网下载https://redis.io/insight/ 2.安装方法3.使用方法3.1.进入RedisDesktopManager的主界面3.2 新建连接3.3 支持操作 Redis Desktop Ma…

面试-JMM的内存可见性

1.JAVA内存模型 分析: 由于JVM运行程序的实体是线程,而每个线程创建时,JVM都会 为其创建一个工作内存(栈空间),用于存储线程私有的数据。而java内存模型中规定所有变量都存储在主内存中。主内存是共享内存区域,所有线程都可以访问…

标准版回收站的商品怎么删除?

管理后台/维护/数据维护/清除数据 里面就可以清空回收站的商品

ElasticSearch-Windows系统ElasticSearch(ES)的下载及安装

前言 下载ElasticSearch 可以进入ElasticSearch官方下载地址,选择与电脑系统相对应的版本;博主已经上传资源,或者点此直接免费下载,本次演示版本为8.14.1。 注意: Elasticsearch 5 需要 Java 8 以上版本;…

VMware连接不到网络

我使用VMware创建了一个虚拟机,但是连接不到网络,试了很多网上的办法,但是还是没有解决问题,最后换了个思路,终于解决,下面分享解决方法: 1. 新解决思路 首先打开虚拟机(我用的是u…