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验证(令牌)的更多相关文章

  1. API验证及AES加密

    API验证 API验证: a. 发令牌: 静态 PS: 隐患 key被别人获取 b. 动态令牌 PS: (问题越严重)用户生成的每个令牌被黑客获取到,都会破解 c. 高级版本 PS: 黑客网速快,会窃 ...

  2. API验证

    API验证说明 API验证: a. 发令牌: 静态 PS: 隐患 key被别人获取 b. 动态令牌 PS: (问题越严重)用户生成的每个令牌被黑客获取到,都会破解 c. 高级版本 PS: 黑客网速快, ...

  3. CMDB API验证

    CMDB API验证 为什么做API验证 API验证是防止数据在传输的过程中,保证数据不被篡改 如何设计的API验证 灵感来源于Torando中加密Cookie的源码,主要是生成加密的随机字符串. M ...

  4. 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 ...

  5. CMDB服务器管理系统【s5day90】:API验证

    1.认证思路刨析过程 1.请求头去哪里拿? 1.服务器端代码: def test(request): print(request) return HttpResponse('你得到我了') 2.客户端 ...

  6. API验证插件

    前言 如果在访问某WebAPI过程中request信息被他人截获,若是get请求获取数据还好,如果是post提交数据,势必威胁数据安全,所以对于一个对安全性要求较高的API来说,对每个请求做身份验证显 ...

  7. CMDB 数据加密 最终整合API验证+AES数据加密

    当CMDB运行在内网的时候,经过API验证的三关是没有问题的,但是如果运行在外网,有一个问题是,黑客截取后的访问速度比客户端快的时候还会造成数据泄露.为了解决这个问题,就要对数据进行加密 RSA加密 ...

  8. django用户验证机制

    django的验证机制 from django.contrib.auth.decorators import login_required 需要在要验证的界面添加`@login_required` 登 ...

  9. 基于 JWT-Auth 实现 API 验证

    基于 JWT-Auth 实现 API 验证 如果想要了解其生成Token的算法原理,请自行查阅相关资料 需要提及的几点: 使用session存在的问题: session和cookie是为了解决http ...

随机推荐

  1. 【Asp.net入门5-02】创建数据模型和存储库

  2. SQL Server 2012安装图解

    SQL Server 2012 Enterprise Edition安装图解... 第一部分:安装前的准备 1.疑问:一个PC上可以安装多个SQL Server数据库么 答案:可以的.每一个安装的时候 ...

  3. 总结: 《jQuery基础教程》 1-4章

    前言: 因为公司的项目用到了jQuery+Bootstrap,而Bootstrap基于jQuery,突然发现自己只是很久前看过jQuery的视频教程,对jQuery的一些API有一些了解,在使用中还是 ...

  4. Challenge 18

    Challenge 18给你一个长度为 n 的非负整数序列 a 和 m 个询问 l, r, p, k,表示询问在 a[l .. r] 中 a[i]%p=k 的 i 的个数. 思路: 将序列分为根号n块 ...

  5. 【实操笔记】MySQL主从同步功能实现

    写在前边: 这两天来了个需求,配置部署两台服务器的MySQL数据同步,折腾了两天查了很多相关资料,一直连不上,后来发现其实是数据库授权的ip有问题,我们用的服务器是机房中的虚拟机加上反向代理出来的,坑 ...

  6. 关于thinkpad安装win10操作系统

    thinkpad预装的是win8或者win10,会有自己的分区方式是GPT,所以会出现两个引导分区. F2进入tinkpad的bios,F12进入启动选项 我们用pe进入后,用分区工具删除两个分区,然 ...

  7. #Fixed# easy-animation | Animation for Sass

    原文链接:http://www.cnblogs.com/maplejan/p/3659830.html 主要修复3.4版本后变量作用域的问题. 代码如下: /* easy-animation.scss ...

  8. 悲催的IE6 七宗罪大吐槽(带解决方法)第二部分

    三.position:fixed无效 今天在IE6上遇到一个bug,本来想做一个消息提示框,让他在页面右上角停留一段时间后消失,这段时间内提示框随着页面的下拉一直出现在浏览器可见区的顶部,于是我用到了 ...

  9. TED_Topic5:How virtual reality can create the ultimate empathy machine

    By Chris Milk # Background about our speaker Working at the frontiers of interactive technology, Chr ...

  10. Linux学习5-线程

    线程 1.1什么是线程? 在一个程序中的多个执行路线就叫做线程(thread).更准确的定义是:线程是一个进程内部的一个控制序列.   要搞清楚fork系统调用和创建新线程之间的区别.当进程执行for ...