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. Halcon算子含义

    1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样本添加到一个高斯混合模型的训练数据上. 2.classify_class_gmm ...

  2. Windows下的GUI 库

    Windows 下的 GUI 解决方案比较多: 基于 C++ 的有 Qt.MFC.WTL.wxWidgets.DirectUI.Htmlayout: 基于 C# 的有 WinForm.WPF: 基于 ...

  3. asp.net 管道处理模式

  4. 收集到的技术相关网址——delphi

    1.DLL封装登录框架实现代码复用 https://www.cnblogs.com/wenwencao/articles/1333659.html

  5. FPGA模N计数器的实现

    module ModuloN_Cntr(Clock, Clear, Q, QBAR); , UPTO = ;//计数器位数以及模数 input Clock, Clear; :]Q, QBAR; :]C ...

  6. 浅尝HTML5之canvas

    转自:http://segmentfault.com/a/1190000000661407/ HTML5新标签 HTML5新引入header,footer,article,section,aside和 ...

  7. 基于hibernate的BaseDao及其实现类的设计

    以前做设计的时候dao接口和它的实现了,这样子就不必写这么多的重复代码了.但由于对反射没有了解,除非依赖hibernate的其他组件,否则写不出来.不过,有了反射,我们可以通过泛型来实现我们想要做的功 ...

  8. Android开发之《内存对齐》

    为什么要进行内存对齐以及对齐规则:http://www.cnblogs.com/jijiji/p/4854581.html 1. 在32位系统中定义变量最好用int,因为这样效率高.原因就在于32位的 ...

  9. estt

    1.路由控制的定义 1.1.IP地址与路由控制 互联网是由路由器连接的网络组合而成的.为了能让数据包正确地到达目标主机,路由器必须在途中进行正确地转发.这种向"正确的方法"转发数据 ...

  10. javaweb 中 error-page

    我们的请求找不到时,会跳到错误页面,tomcat提供了一个错误页面,但是不太好.分析:tomcat自带错误页面不好的原因:有一下两点: 1.不好看: 2.不能为seo做出贡献.思考:如何解决以上问题? ...