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 相关文章推荐
在Python3中使用asyncio库进行快速数据抓取的教程
Apr 02 Python
python中常用检测字符串相关函数汇总
Apr 15 Python
pycharm安装图文教程
May 02 Python
python-tkinter之按钮的使用,开关方法
Jun 11 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
Aug 05 Python
Numpy 中的矩阵求逆实例
Aug 26 Python
Python中函数的返回值示例浅析
Aug 28 Python
Django框架下静态模板的继承操作示例
Nov 08 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
Feb 28 Python
python实例化对象的具体方法
Jun 17 Python
全网最详细的PyCharm+Anaconda的安装过程图解
Jan 25 Python
Python数组变形的几种实现方法
May 30 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
用PHP与XML联手进行网站编程代码实例
2008/07/10 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
2015/07/01 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
JS远程获取网页源代码实例
2013/09/05 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
详解vue使用$http服务端收不到参数
2019/04/19 Javascript
对Python 检查文件名是否规范的实例详解
2019/06/10 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
python中wheel的用法整理
2020/06/15 Python
英国汽车和货车租赁网站:Hertz英国
2016/09/02 全球购物
倩碧英国官网:Clinique英国
2018/08/10 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
打架检讨书50字
2014/01/11 职场文书
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
JavaScript实现显示和隐藏图片
2021/04/29 Javascript
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP
python三子棋游戏
2022/05/04 Python