Django API验证(令牌)
1. 获取接口信息
Client端
import requests
import time
import hashlib ctime = time.time() key = 'akfljakfjaklfjaklfj22222324290482'
new_key = "%s|%s" % (key, ctime) m = hashlib.md5()
m.update(bytes(new_key, encoding='utf-8'))
md5_key = m.hexdigest()
md5_key_key = "%s|%s" % (md5_key, ctime)
print(md5_key_key)
response = requests.get("http://127.0.0.1:8001/api/asset.html", headers={'OpenKey':md5_key_key})
print(response.text)
2. 验证令牌信息
Server端
import hashlib
import time
from django.shortcuts import render,HttpResponse
from django.conf import settings
api_key_record = {} def asset(request):
client_md5_time_key =request.META.get('HTTP_OPENKEY')
client_md5_key,client_ctime = client_md5_time_key.split('|') client_ctime = float(client_ctime)
server_time = time.time() # 第一关:时间关 10s内访问 if server_time - client_ctime >10:
return HttpResponse('[第一关] 访问时间超时!') # 第二关:规则关 防止修改时间
temp = "%s|%s"%(settings.AUTH_KEY,client_ctime,)
m = hashlib.md5()
m.update(bytes(temp,encoding='utf-8'))
server_md5_key = m.hexdigest()
if server_md5_key != client_md5_key:
return HttpResponse('[第二关] 规则不正确') for k in list(api_key_record.keys()):
v = api_key_record[k]
if server_time > v:
del api_key_record[k] # 第三关
if client_md5_time_key in api_key_record:
return HttpResponse('[第三关] 令牌已使用过')
else:
api_key_record[client_md5_time_key] = client_ctime +10 if request.method == "GET":
return HttpResponse('GET: 获取重要数据')
elif request.method == "POST":
return HttpResponse('POST')
3. 模拟请求
正常请求:nomary GET请求
import requests
import time
import hashlib ctime = time.time() key = 'akfljakfjaklfjaklfj22222324290482'
new_key = "%s|%s" % (key, ctime) m = hashlib.md5()
m.update(bytes(new_key, encoding='utf-8'))
md5_key = m.hexdigest()
md5_key_key = "%s|%s" % (md5_key, ctime)
print(md5_key_key)
response = requests.get("http://127.0.0.1:8001/api/asset.html", headers={'OpenKey':md5_key_key})
print(response.text)
正常请求结果
f8012ba778903e8dd1185173ed33b0b8|1550306560.9089868
GET: 获取重要数据
骇客攻击请求
hack请求
import requests md5_key_key = '5e287e46a67ec778df70d27e7a5b8d6e|1550306579.3672032'
response = requests.get("http://127.0.0.1:8001/api/asset.html", headers={'OpenKey':md5_key_key})
print(response.text)
hack请求结果
[第三关] 令牌已使用过
总结:
第一关:时间关 客户端的时间和服务端的时间进行比较 10s内是正常访问 超过10s则为超时访问
if server_time - client_ctime > 10:
return HttpResponse('[第一关] 访问时间超时!') 第二关:规则关 防止修改时间 服务端把服务期设置的key和客户端发来的时间进行md5加密 然后再和客户端发来的动态令牌进行比较是否一致 第三关:过期令牌删除
1、判断客户端的令牌是否在api记录里
2、如果在表示已使用不再被使用
3、如果不在将令牌作为key 客户端时间+10作为value放在api记录里
4、这样每次在判断令牌是否在记录表中的时候,先遍历记录表进行比较
比较当前的服务时间是否大于客户端+10s的时间key,如果大于则已过期直接删除,否则不做处理
5、当然如果用redis的话,这部操作不用关心,redis key 5s key后面指定时间redis会自动删除
Django API验证(令牌)的更多相关文章
- API验证及AES加密
API验证 API验证: a. 发令牌: 静态 PS: 隐患 key被别人获取 b. 动态令牌 PS: (问题越严重)用户生成的每个令牌被黑客获取到,都会破解 c. 高级版本 PS: 黑客网速快,会窃 ...
- API验证
API验证说明 API验证: a. 发令牌: 静态 PS: 隐患 key被别人获取 b. 动态令牌 PS: (问题越严重)用户生成的每个令牌被黑客获取到,都会破解 c. 高级版本 PS: 黑客网速快, ...
- CMDB API验证
CMDB API验证 为什么做API验证 API验证是防止数据在传输的过程中,保证数据不被篡改 如何设计的API验证 灵感来源于Torando中加密Cookie的源码,主要是生成加密的随机字符串. M ...
- python API验证
API验证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 API验证: a. 发令牌: 静态 PS: 隐患 key ...
- CMDB服务器管理系统【s5day90】:API验证
1.认证思路刨析过程 1.请求头去哪里拿? 1.服务器端代码: def test(request): print(request) return HttpResponse('你得到我了') 2.客户端 ...
- API验证插件
前言 如果在访问某WebAPI过程中request信息被他人截获,若是get请求获取数据还好,如果是post提交数据,势必威胁数据安全,所以对于一个对安全性要求较高的API来说,对每个请求做身份验证显 ...
- CMDB 数据加密 最终整合API验证+AES数据加密
当CMDB运行在内网的时候,经过API验证的三关是没有问题的,但是如果运行在外网,有一个问题是,黑客截取后的访问速度比客户端快的时候还会造成数据泄露.为了解决这个问题,就要对数据进行加密 RSA加密 ...
- django用户验证机制
django的验证机制 from django.contrib.auth.decorators import login_required 需要在要验证的界面添加`@login_required` 登 ...
- 基于 JWT-Auth 实现 API 验证
基于 JWT-Auth 实现 API 验证 如果想要了解其生成Token的算法原理,请自行查阅相关资料 需要提及的几点: 使用session存在的问题: session和cookie是为了解决http ...
随机推荐
- MatConvNet+Matlab2017a+CUDA8.0安装
安装过程参照MatConvNet官网给出的步骤: http://www.vlfeat.org/matconvnet/install/ 1.安装CUDA8.0+cudnn6.0 参见之前的博客 2.安装 ...
- Feign来调用服务
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解.Feign支持可 ...
- etcd3集群管理
目录 在什么情况下需要集群的运行时更改 集群运行时更改的操作 更新一个节点 删除一个节点 增加一个节点 节点迁移和灾难恢复 迁移节点 灾难恢复 在什么情况下需要集群的运行时更改 维护和升级多个机器 如 ...
- 互斥锁 pthread_mutex_init()函数
Linux下为了多线程同步,通常用到锁的概念.posix下抽象了一个锁类型的结构:ptread_mutex_t.通过对该结构的操作,来判断资源是否可以访问.顾名思义,加锁(lock)后,别人就无法打开 ...
- Redis学习十:Redis的复制(Master/Slave)【重要】
一.是什么 官网 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 二.能干嘛 读写分离 容灾恢 ...
- windows git gui右键sublime打开当前文件编辑
git安装目录\Git\libexec\git-core\git-gui.tcl的 proc create_common_diff_popup 下追加: $ctxm add command \ -la ...
- 20155232 2016-2017-3 《Java程序设计》第7周学习总结
20155232 2016-2017-3 <Java程序设计>第7周学习总结 教材学习内容总结 第十三章 1.Greenwich MeanTime,格林威治时间,简称GMT时间,由观察太阳 ...
- 一个菜鸟的ASP.NET观光路线图
作为一个成长的"菜鸟".我的习惯是,每过一个阶段,都对自己的知识体系进行一次概括. 这篇博文是一个总结帖,我将把我的学到的东西,按照一定顺序串联在一起. ...
- 【译】第二篇 Integration Services:SSIS数据泵
本篇文章是Integration Services系列的第二篇,详细内容请参考原文. 简介SSIS用于移动数据.数据流任务提供此功能.因为这个原因,当介绍SSIS时我喜欢从数据流任务开始.数据流任务的 ...
- 【译】第十二篇 SQL Server代理多服务器管理
本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...