Django HMAC 请求签名校验与 Vue.js 实现安全通信


概要

在 Web 应用的开发过程中,确保数据传输的安全性和完整性是一个不容忽视的问题。使用 HMAC(Hash-based Message Authentication Code)算法对请求内容进行签名校验,是一种常见且有效的安全策略。本文将详细介绍如何在 Django 后端实现 HMAC 签名校验,并展示如何在前端 Vue.js 应用中生成对应的签名,从而确保前后端通信的安全性。


1. Django 后端实现

步骤 1: 安装所需库

在 Django 项目中,我们首先确保安装了 hmac 和 hashlib,这些通常是 Python 标准库的一部分。

步骤 2: 创建签名生成函数

在 Django 应用中,创建一个函数来生成基于 HMAC 的签名。

import hmac
import hashlib

def generate_hmac_signature(method, accept, content_type, path, body, secret_key):
    msg = f"{method}{accept}{content_type}{path}{body}"
    return hmac.new(secret_key.encode(), msg.encode(), hashlib.sha256).hexdigest()

步骤 3: 创建中间件进行签名校验

创建一个 Django 中间件来验证传入请求的签名。

# middleware.py
from django.http import JsonResponse

class HmacAuthenticationMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        secret_key = 'your-secret-key'
        request_signature = request.headers.get('X-HMAC-Signature')

        # 构建签名字符串
        method = request.method
        accept = request.headers.get('Accept', '')
        content_type = request.headers.get('Content-Type', '')
        path = request.path
        body = request.body.decode()

        expected_signature = generate_hmac_signature(method, accept, content_type, path, body, secret_key)

        if not hmac.compare_digest(expected_signature, request_signature):
            return JsonResponse({'error': 'Invalid signature'}, status=403)

        return self.get_response(request)

步骤 4: 注册中间件

在 Django 的 settings.py 中注册这个中间件。

# settings.py

MIDDLEWARE = [
    # ...
    'path.to.HmacAuthenticationMiddleware',
    # ...
]

2. 前端实现(Vue.js)

步骤 1: 安装 Crypto-js

在 Vue.js 项目中,安装 crypto-js 来生成 HMAC 签名。

npm install crypto-js

步骤 2: 在 Axios 请求中添加签名

在 Vue.js 应用中,创建一个 Axios 请求拦截器,为每个请求添加 HMAC 签名。

// http.js
import axios from 'axios';
import CryptoJS from 'crypto-js';

const secretKey = 'your-secret-key';

axios.interceptors.request.use(config => {
    const { method, headers, url, data } = config;
    const accept = headers['Accept'] || '';
    const contentType = headers['Content-Type'] || '';
    const path = url; // 假设 url 是完整路径
    const body = JSON.stringify(data || {});

    // 生成签名
    const msg = `${method.toUpperCase()}${accept}${contentType}${path}${body}`;
    const signature = CryptoJS.HmacSHA256(msg, secretKey).toString();

    config.headers['X-HMAC-Signature'] = signature;

    return config;
}, error => {
    return Promise.reject(error);
});

export default axios;

在 Vue 组件中,使用这个配置的 Axios 实例发送请求。

3. 安全考虑

  • 密钥保密:确保前后端使用相同的密钥,并且密钥在前端不被暴露。最好的做法是将密钥保存在环境变量中。

  • 防止重放攻击:可以在签名中包含一个时间戳和/或一个随机数,并在服务端验证这个时间戳的有效性。

4. 测试和调试

  • 测试确保前后端签名生成一致。

  • 使用 Postman 或类似工具测试 API 请求,确保中间件正确校验签名。

总结

通过在 Django 后端实现 HMAC 签名校验的中间件,并在 Vue.js 前端生成相应的签名,可以大大增强应用的安全性。这种机制确保了数据在传输过程中的完整性和身份的验证。正确实施这些措施需要确保前后端的协调一致,并妥善处理安全相关的细节。

640?wx_fmt=gif&wxfrom=5&wx_lazy=1&wx_co=1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[1] AR Tag 在ros中的使用

1.定义 AR Tag 是一种用于增强现实(AR)应用中的视觉标记,用于跟踪和定位虚拟物体在现实世界中的位置。 AR Tag由黑白正方形图像表示,图像内部有黑色边框中的某些图案。它与我们经常用到的二维码长得类似,原理其实也一…

STM32内部温度传感器使用方法详解

STM32内部温度传感器使用方法详解 前言 STM32内部集成了一个片上温度传感器,可以用来测量MCU及周围的温度。测量范围:-40~125,精度1.5℃。虽然精度不高,但在某些应用场景下是够了的,相比于外部接入传感器&#xff0c…

nodejs微信小程序+python+PHP金融产品销售系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

Windows server 2016 FTP服务器的搭建

FTP(File Transfer Protocol)是一个用来在两台计算机之间传输文件的通信协议。这两台计算机中,一台是FTP服务器,另一台是FTP 客户端。 1.安装FTP服务与建立FTP站点 1.1 打开服务器管理器——单击仪表盘的添加角色和功能 1.2 持续…

【计算机网络笔记】PPP协议

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

C语言:写一个函数,输入一个十六进制数,输出相应的十进制数

分析: 当用户运行该程序时,程序会提示用户输入一个十六进制数。用户需要在命令行中输入一个有效的十六进制数,例如:"1A3F"。 接下来,程序调用了名为 xbed 的函数,并将用户输入的十六进制数作…

Linux 权限管理

1 Linux 安全模型 AAA认证资源分派: 当用户登录时,系统会自动分配令牌 token,包括用户标识和组成员等等信息 1.1 用户 Linux 中每个用户是通过 User ID(UID)来唯一标识的。 1.2 用户组 Linux 中可以将一个或者多个…

limit 10和limit 10000 10效率相同吗

先说结论:不相同,差异很大。 set profiling 1;select * from xiatui order by id limit 10000,10;select * from xiatui order by id limit 10;show profiles; select * from xiatui order by name limit 90000,10;select * from xiatui order by name…

使用 NRF24L01 无线收发模块进行远程控制

NRF24L01 是一款基于 2.4GHz 射频通信的低功耗无线收发模块,具有高性能和稳定性,适用于远程控制和数据传输应用。本文将介绍如何使用 NRF24L01 模块进行远程控制,包括硬件的连接和配置,以及相应的代码示例。 一、引言 NRF24L01 是…

k8s报错

报错: 这个错误信息表明你的容器运行时(container runtime)没有正常运行,具体是因为CRI(容器运行时接口)v1版本的API没有为特定的端点实现。这通常发生在使用containerd作为容器运行时时。错误信息中提到的…

@RequestMapping处理请求异常

使用RequestMapping不指定请求方式,多种请求方式都支持。 Get格式FORM_URLENCODED Content-Typeapplication/x-www-form-urlencoded URL形式传参,请求体里面的内容是:usernamejohnexample.com&passwordsecretpassword&grant_type…

1.2 Ubauntu 使用

一、完成VMware Tools安装 双击 VMwareTool 打开 Ubuntu 终端快捷键 AltControlT 切换汉语的快捷键是Alt空格 ls 打印出当前所在目录中所有文件和文件夹 cd 桌面 进入桌面文件夹 sudo ./vmware-install.pl 安装tool,输入之前设置的密码。 地址默认,按…

论文阅读——Img2LLM(cvpr2023)

arxiv:[2212.10846] From Images to Textual Prompts: Zero-shot VQA with Frozen Large Language Models (arxiv.org) 一、介绍 使用大语言模解决VQA任务的方法大概两种:multi-modal pretraining and language-mediated VQA,即多模态预训练…

web:[NPUCTF2020]ReadlezPHP

题目 打开页面显示如下 没发现其他的线索,查看源代码 发现一个网址,访问这个页面查看 进行代码审计 这段代码是一个简单的 PHP 类,名为 HelloPhp。它有两个公共属性 $a 和 $b,并在构造函数中将它们分别初始化为字符串 "Y-m-…

Linux命令与shell脚本编程大全【读书笔记 + 思考总结】

Linux命令与shell脚本编程大全 第 1 章 初识Linux shellLinux的组成及关系结构图是什么?Linux系统内核的作用是什么?内核的主要功能是什么?(4点)物理内存和虚拟内存是什么关系?内核如何实现虚拟内存&#x…

zabbix 监控

zabbit 监控 非常成熟的监控软件。 运维人员,尽快系统服务器的状态,网站的流量,服务进程的运行状态。 保证整个集群的工作正常。7*24 zabbix是什么: web界面提供的一种可视化监控服务软件。 分布式的方式系统监控以及网络监控…

NodeJs(一):初识nodejs、模块化、CommonJS、ESModule等

目录 (一)Nodejs简介 1.nodejs是什么 2.nodejs架构 3.nodejs的应用场景 (二)准备工作 1.安装nodejs 2.nodejs版本管理工具 (三)nodejs的使用 1.node的输入 2.node的输出 3.其他的console方法 (四)全局对象 1.常见的全局对象 2.特殊的全局对象 3.global和window的…

用友U8 ERP和面粉行业专版系统接口集成方案

面粉加工行业面临着数据管理和业务流程自动化的挑战。众诚ERP系统和用友U8系统的数据集成是解决这一挑战的关键。 解决方案 轻易云平台提供了一套完善的数据同步和集成解决方案,包括以下几个方面: 基础资料同步:包括物料、客户、供应商、仓…

matlab 路面裂缝检测识别系统设计GUI

1、内容简介 略 23-可以交流、咨询、答疑 2、内容说明 路面裂缝检测识别系统设计GUI 基于matlab的GUI设计路面裂缝检测识别系统 matlab、GUI、直方图、裂缝检测、二值化 3、仿真分析 4、参考论文 略 链接:https://pan.baidu.com/s/1AAJ_SlHseYpa5HAwMJlk…

​LeetCode解法汇总2661. 找出叠涂元素

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给你一个下…