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 示例分享---逻辑推理编程解决八皇后
Jul 20 Python
在Python中操作时间之mktime()方法的使用教程
May 22 Python
轻松掌握python设计模式之策略模式
Nov 18 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
Windows下安装Django框架的方法简明教程
Mar 28 Python
django 开发忘记密码通过邮箱找回功能示例
Apr 17 Python
django中SMTP发送邮件配置详解
Jul 19 Python
Python中使用gflags实例及原理解析
Dec 13 Python
Python正则表达式如何匹配中文
May 27 Python
浅谈keras中loss与val_loss的关系
Jun 22 Python
Linux安装Python3如何和系统自带的Python2并存
Jul 23 Python
python函数的两种嵌套方法使用
Apr 02 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中hashtable实现示例分享
2014/02/13 PHP
php事件驱动化设计详解
2016/11/10 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
Prototype Template对象 学习
2009/07/19 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
对vux点击事件的优化详解
2018/08/28 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
使用python解析xml成对应的html示例分享
2014/04/02 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
python编程实现归并排序
2017/04/14 Python
《Python学习手册》学习总结
2018/01/17 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
简单了解python元组tuple相关原理
2019/12/02 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
西部世纪面试题
2014/12/05 面试题
女子职高个人自荐书
2014/02/01 职场文书
小学毕业感言300字
2014/02/19 职场文书
市场部经理岗位职责
2014/04/10 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL