django fernet fields字段加密实践详解


Posted in Python onAugust 12, 2019

一、fernet介绍

Fernet 用于django模型字段对称加密,使用 crytography 库。

官网帮助文档

1、先决条件

django-fernet-fields 支持Django 1.8.2以及更高版本,Python 2.7、3.3、3.4、pypy和pypy3。

测试了PostgreSQL、SQLite和MySQL可用,但是任何支持BinaryField的Django数据库后端应该都可以运行。

2、安装

django-fernet-fields 在 PyPI可用,可用如下方法安装:

pip install django-fernet-fields

二、fernet使用

1、用法示例

只需导入并使用模型中包含的字段类:

from django.db import models
from rbac.models import *
from fernet_fields import EncryptedCharField
class Customer(models.Model):
  """ 客户(学生)表 """
  name = EncryptedCharField(verbose_name='姓名', max_length=64)
  gender_choices = (
    (1, '男'),
    (2, '女')
  )

可以声明变量并和往常一样读取name字段的值,但是这些值在发送到数据库之前会自动进行加密,并在数据库中读取时进行解密。

加密和解密都将在本地应用中执行,密钥永远不会发送到数据库服务器,数据库仅查看此字段的加密值。

2、字段类型

常用的字段类如下:EncryptedCharField, EncryptedEmailField, EncryptedIntegerField, EncryptedDateField, and EncryptedDateTimeField. 所有字段类都接受与其非加密版本相同的参数。

要创建其他一些自定义字段类的加密版本,可以从EncryptedField和其他字段类继承:

from fernet_fields import EncryptedField
from somewhere import MyField
class MyEncryptedField(EncryptedField, MyField):
  pass

3、可空字段

允许使用可空的加密字段; NonePython中的值被转换为NULL数据库列中的实数。请注意,这通常会在列中向攻击者显示数据的存在与否。如果这是您的问题,请避免使用可空的加密字段; 而是在非可空加密字段中存储一些其他的标记“空”值(将像任何其他值一样加密)。

三、索引,约束和查找

由于Fernet加密不是确定性的(使用相同密钥加密的相同源文本每次都会导致不同的加密令牌),因此索引或强制执行唯一性或对加密数据执行查找是无用的。每个加密值总是不同的,每次完全匹配查找都会失败; 其他查找的结果将毫无意义。

由于这个原因,如果通过了 db_index=True,unique=True,primary_key=True,EncryptedField 将抛出 django.core.exceptions.ImproperlyConfigured。并且对于 EncryptedField 的任何类型的查找。除了为空之外,都将抛出django.core.exceptions.FieldError。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 Python
python实现udp数据报传输的方法
Sep 26 Python
快速入门python学习笔记
Dec 06 Python
python如何定义带参数的装饰器
Mar 20 Python
Python3.6笔记之将程序运行结果输出到文件的方法
Apr 22 Python
python批量替换多文件字符串问题详解
Apr 22 Python
Python图像处理之识别图像中的文字(实例讲解)
May 10 Python
Python使用pylab库实现绘制直方图功能示例
Jun 01 Python
使用TensorFlow实现SVM
Sep 06 Python
Django stark组件使用及原理详解
Aug 22 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
python实现贪吃蛇双人大战
Apr 18 Python
利用pyecharts实现地图可视化的例子
Aug 12 #Python
django echarts饼图数据动态加载的实例
Aug 12 #Python
python scrapy爬虫代码及填坑
Aug 12 #Python
Python 中的 global 标识对变量作用域的影响
Aug 12 #Python
Python中pymysql 模块的使用详解
Aug 12 #Python
python中类的输出或类的实例输出为这种形式的原因
Aug 12 #Python
对Django 中request.get和request.post的区别详解
Aug 12 #Python
You might like
我常用的几个类
2006/10/09 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
2015/08/23 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
微信小程序实现上传图片功能
2018/05/28 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
微信小程序实现同一页面取值的方法分析
2019/04/30 Javascript
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
2020/03/16 Javascript
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
[01:28]一分钟告诉你DOTA2 TI9不朽宝藏Ⅱ中有什么!
2019/07/09 DOTA
Python中的并发编程实例
2014/07/07 Python
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
Python装饰器基础详解
2016/03/09 Python
Python使用SocketServer模块编写基本服务器程序的教程
2016/07/12 Python
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
Python人脸识别第三方库face_recognition接口说明文档
2019/05/03 Python
在python shell中运行python文件的实现
2019/12/21 Python
python 串行执行和并行执行实例
2020/04/30 Python
巾帼志愿者活动方案
2014/08/17 职场文书
个人买房协议书范本
2014/10/06 职场文书
上甘岭观后感
2015/06/10 职场文书
小学运动会加油稿
2015/07/22 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python