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

本文主要是介绍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 hashlibdef 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 JsonResponseclass HmacAuthenticationMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):secret_key = 'your-secret-key'request_signature = request.headers.get('X-HMAC-Signature')# 构建签名字符串method = request.methodaccept = request.headers.get('Accept', '')content_type = request.headers.get('Content-Type', '')path = request.pathbody = 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.pyMIDDLEWARE = [# ...'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

这篇关于Django HMAC 请求签名校验与 Vue.js 实现安全通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/444425

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配