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


    在这里插入图片描述
    深度学习类文章回顾
    【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示例源码),关注获取更多内容!

    在这里插入图片描述

  • 相关阅读:
    【兄弟反目成仇系列】:我只是写了一个爆炸信息窗口脚本,好兄弟追了我几条街~
    TensorFlow基本概念与常用函数
    算法---解码方法(Kotlin)
    读 | SA : The Hard Parts 之数据所有权
    【闲聊杂谈】ElasticSearch的分布式原理
    一级造价工程师(安装)- 计量笔记 - 第六章第三节通信设备及线路工程
    六、Spring Boot 整合 NoSQL(4)
    宠物网页作业HTML 大一作业HTML宠物网页作业 web期末大作业HTML 动物网页作业HTML HTML制作宠物网页作业css
    C++day7
    【安卓app毕业设计源码】基于Uniapp的掌上校园管理系统
  • 原文地址:https://blog.csdn.net/oBoLuoChuiXue12/article/details/140053937