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. 团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树

    L2-006. 树的遍历 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...

  2. hdu 6311 欧拉回路

    题意:求一个图(不一定联通)最小额外连接几条边,使得可以一笔画出来 大致做法 1.找出联通块 2.统计每一个连通块里面度数为奇数的点的个数, 有一个性质 一个图能够用一笔画出来,奇数点的个数不超过2个 ...

  3. Chapter3 (字符串,向量,数组) --C++Prime笔记

    1.using用法:using namespace ::name;注意事项:一般不在头文件使用using否则很容易导致运用命名空间不对错误. 2.string的方法: ①getline(输入流,str ...

  4. Kubernetes之利用prometheus监控K8S集群

    prometheus它是一个主动拉取的数据库,在K8S中应该展示图形的grafana数据实例化要保存下来,使用分布式文件系统加动态PV,但是在本测试环境中使用本地磁盘,安装采集数据的agent使用Da ...

  5. python的函数介绍 位置参数 关键字参数 默认参数 参数组 *args **kwargs

    1.数学意义的函数与python中的函数 数学意义的函数 y = 2*3+1 x =3 y =7 x是自变量,y是因变量 2.python中定义函数的方法 一个函数往往都是为了完成一个特定的功能而存在 ...

  6. 《剑指offer》 面试题53 :正则表达式匹配 Java

    引言:这道题情况比较复杂,边界条件较多,为了便于以后复习,整理一下.另外,由于C语言和Java对于字符串的操作存在不一样的地方,代码也存在改动. 题目:请实现一个函数用来匹配包含'.'和'*'的正则表 ...

  7. RabbitMQ消息队列里积压很多消息

    1.场景:上千万条消息在mq里积压了几个小时了还没解决 2.解决: 1)先修复consumer的问题,确保其恢复消费速度,然后将现有cnosumer都停掉 2)新建一个topic,partition是 ...

  8. Nlog写日志到数据库

    https://github.com/nlog/NLog/wiki/Database-Target

  9. radioButton drawable selector

    1.实现radioButton drawable selector更改图片,在drawable文件夹下,新建selector文件, <selector xmlns:android="h ...

  10. <转>Android开发使输入框点击弹出日期选择对话框的方法

    非常简单直接上代码: 转自:http://blog.sina.com.cn/s/blog_4ac1b5f60102vgnx.html final EditText et1=(EditText)find ...