django自带一个加密的方法signer,对数据进行一个加密

一般这种方式用于账号密码邮箱找回,或者token设置

class TimestampSigner(Signer):

    def timestamp(self):
return baseconv.base62.encode(int(time.time())) def sign(self, value):
value = '%s%s%s' % (value, self.sep, self.timestamp())
return super().sign(value) def unsign(self, value, max_age=None):
"""
Retrieve original value and check it wasn't signed more
than max_age seconds ago.
"""
result = super().unsign(value)
value, timestamp = result.rsplit(self.sep, 1)
timestamp = baseconv.base62.decode(timestamp)
if max_age is not None:
if isinstance(max_age, datetime.timedelta):
max_age = max_age.total_seconds()
# Check timestamp is not older than max_age
age = time.time() - timestamp
if age > max_age:
raise SignatureExpired(
'Signature age %s > %s seconds' % (age, max_age))
return value

这是django文档中的源码 ,可以看到是继承自signer类的,其中sign函数是对输入的数据加上当前时间戳进行一个加密

unsign则是验证加密数据是否过时,得到传入加密数据的时间戳,对函数中max_age时间转换为时间格式对比,如果当前时间减去加密数据的时间大于设置的规定时间,则抛出异常,不然返回正确的值

但是有个大问题,就是 加密数据会显示出来      比如加密数据{'name':'小明'}  会显示为' {'name':'小明'}:fszfdfyhYRTCFVDRSVG15R1X32B'  这种明显不行


后来在网上查找 发现sign类中含有序列化进行一个加密 并且可以添加对时间的控制

其实就是将上面的 TimestampSigner 类的时间戳加密弄过来了 返回一串加密字符          其中默认使用当时时间戳进行时间认证 不像flask在进行加密时可以确认过期时间 相反

可以保存到cookies中,进下一个页面需要验证使用这个验证(ps在这cookies卡了好久,我还以为咋cookeis没传过去,一直是空的 原来需要HttpResponse设置...)


解密sign 值

同样也是 TimestampSigner 的时间戳解密  源码如下

key和sigin加密一样默认不设置,先以简单为主

其中有一个参数max_age(用来对比时间)  unsign解密源码

比如你是在1点10分进行一个加密,加密sign数值中含有1点10分的时间,使用unsign解密 输入max_age=60  数值为秒  不设置则为永久存在

解密过程中对比 将时间格式化     当前解密时的时间 减去 加密的时间  得到相减的时间 如果大于设置过期时间 抛出异常 不然返回解密值


所以我的代码是

加密

from datetime import datetime
from django.core import signing def set_sign(request): value = signing.dumps({'user':1254,'name':'xiaoming小明'})
print(value) request.COOKIES['sign'] = value
req = HttpResponse('获取sign值成功')
req.set_cookie('sign',value) return req

解密

def get_sign(request):

    value = request.COOKIES.get('sign')
print(value) s = '没有获取到sign'
if value:
try:
s = signing.loads(value,max_age=20)    # 设置过期时间
print(s,datetime.now())
print(type(s))            # 加密时什么格式 返回什么格式
except:
print('sign过期',datetime.now())
s = 'sign过期' return HttpResponse(s)

结果

获取不过期的sign  并得到结果 传入dict得到dict

对比设置解密时间过期 结果

设置的20秒过期  设置sign时间为20:42:23   获取sign的时间为20:43:38  哪怕能获取到sign值,也会解密错误

django 从零开始 11 根据时间戳加密数据的更多相关文章

  1. xadmin在Django 1.11中的使用及中英文切换

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com xadmin是一个强大的替代django admin的管理后台,github地址为:https://g ...

  2. angular 4 和django 1.11.1 前后端交互 总结

    首先 angular4 和django 1.11.1交互 有跨域问题 所以先关闭cors 和csrf验证 一.解决跨域问题 cors github django-cors-headers 1)安装co ...

  3. django第11天(分页器)

    django第11天分页器 分页模块 批量插入数据 book_list = [] #先生成对象 for i in range(100): book = Book(name = 'book%s'%i,p ...

  4. Ubuntu 16.04 安装 Django==1.11.8

    vim  InStall-Django.sh #!/bin/bash rm -rf /usr/bin/python ln -s /usr/bin/python3 /usr/bin/python mkd ...

  5. Django框架11 /form组件、modelForm组件

    Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...

  6. django 1.11.16之环境搭建

    django版本:django1.11.16  windows环境 python 3.6.3    !!!可先安装虚拟环境在进行环境搭建  1.安装django:pip install django= ...

  7. Django 1.11 release note简明解读

    1.首先1.11这个版本是一个LTS版本 2.第一个支持python3.6的版本,最后一个支持python2.*的版本 3.Deprecating warnings 默认不再显示,同时建议第三方包开始 ...

  8. 我希望知道的关于Django的11件事(转)

    英文原文:https://medium.com/cs-math/f29f6080c131 译文:http://my.oschina.net/chenlei123/blog/270672 两年前, 我开 ...

  9. django学习-11.开发一个简单的醉得意菜单和人均支付金额查询页面

    1.前言 刚好最近跟技术部门的[产品人员+UI人员+测试人员],组成了一桌可以去公司楼下醉得意餐厅吃饭的小team. 所以为了实现这些主要点餐功能: 提高每天中午点餐效率,把点餐时间由20分钟优化为1 ...

随机推荐

  1. MS激活

    亲测可用 国内博客  https://msguides.com/ 他是翻译的这个哥们的网页: https://msguides.com/

  2. 四剑客(find&grep)

    一.find 简介: find相关:条件匹配表达式.选项表达式.动作表达式.组合条件表达式 1.1.语法格式 find   path   -option   [   -print ]   [ -exe ...

  3. python模块之shelve,xml,hashlib,configpaser

    shelve shelve模块也是一种可以将数据序列化的模块 使用方法 1. open 2. 读写 3. close 特点:使用方法比较简单 提供一个文件名字就可以开始读写,读写的方法和字典一致;跨平 ...

  4. [LC] 122. Best Time to Buy and Sell Stock II

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  5. java 内存溢出-与gc

    感谢原作者 在日常中我们经常遇到这样的错误:java.lang.OutOfMemoryError: Java heap space. 但是除了heap space 的OutOfMemoryError, ...

  6. 了解DocumentFragment 给我们带来的性能优化

    首先我们需要了解 DocumentFragment 是什么? w3c 上面的详细解释:link here 我把关键点写下来了: DocumentFragment 节点不属于文档树,继承的 parent ...

  7. navicat 导出查询结果

    请依照下列步骤:(Windows 版本) 例子:导出查询结果到一个文本文件 在执行查询之后,保存查询及在工具栏点击导出向导/导出. 按照导出向导的步骤指导你完成 设置导出文件格式(步骤 1) 设置目标 ...

  8. 将js进行到底:node学习4

    使用Node做web开发 HTTP与TCP 上一回使用node.js的NET(TCP)模块开发了一个聊天室demo.单纯用到了原始的TCP协议,可以说TCP是HTTP,SMTP,FTP的鼻祖了,后面的 ...

  9. js组合式继承

    组合式继承是比较经典的继承,但是也有比较严重的缺点就是连两次调用了父类的构造函数. <!DOCTYPE html> <html lang="en"> < ...

  10. 暑假集训第六周contest1

    51Nod - 1413 权势二进制 题意:就是讲给出一个数n,让你求最少由多少个像0,1,10,11......这样的二进制数相加构成:样例n=9就是由9个二进制1相加组成,我不懂比赛的时候我为什么 ...