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. 【THUSC2017】杜老师

    题目描述 杜老师可是要打+∞年World Final的男人,虽然规则不允许,但是可以改啊! 但是今年WF跟THUSC的时间这么近,所以他造了一个idea就扔下不管了…… 给定L,R,求从L到R的这R− ...

  2. 【agc019C】Fountain Walk

    Portal --> agc019C Description 有一个\(10^8*10^8\)的网格图,一格距离为\(100\),第\(x\)条竖线和第\(y\)条横线的交点记为\((x,y)\ ...

  3. Linux最大文件句柄(文件描述符)限制和修改

    转自:http://jameswxx.iteye.com/blog/2096461 写这个文章是为了以正视听,网上的文章人云亦云到简直令人发指.到底最大文件数被什么限制了?too many open ...

  4. Java基础-面向对象第一特性之封装(Encapsulation)

    Java基础-面向对象第一特性之封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.理解什么是面向过程和面向对象 面向过程与面向对象都是我们编程中 ...

  5. Java基础-Collection子接口之List接口

    Java基础-Collection子接口之List接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们掌握了Collection接口的使用后,再来看看Collection接口中 ...

  6. Java8 新特性 Streams map() 示例

    在Java 8中stream().map(),您可以将对象转换为其他对象.查看以下示例: 1.大写字符串列表 1.1简单的Java示例将Strings列表转换为大写. TestJava8.java p ...

  7. 使iis支持asp.net扩展

    打开控制面板 - 程序和功能,点击左边 “打开或关闭 Windows 功能”. 在弹出的对话框中,展开 “Internet信息服务”,展开“万维网服务”,展开“应用程序开发功能”,勾选“ASP”和“A ...

  8. LintCode 388: Kth Permutation

    LintCode 388: Kth Permutation 题目描述 给定 n 和 k,求123..n组成的排列中的第 k 个排列. 样例 对于 n = 3, 所有的排列如下: 123 132 213 ...

  9. 20155209 2016-2017-2 《Java程序设计》第五周学习总结

    20155209 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 try语句用大括号{}指定了一段代码,该段代码可能会抛弃一个或多个例外. catch语句的参 ...

  10. 配置SpringBoot-从日志系统配置说起

    大小系统都需要打日志. 系统在不同环境下对日志的配置要求是不一样的 比如 开发本地: 直接输出到控制台 生产环境: 输出到文件或者额外的日志收集系统, 比如 graylog. (本文不探讨具体日志系统 ...