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翻译软件实现代码(使用google api完成)
Nov 26 Python
Python使用函数默认值实现函数静态变量的方法
Aug 18 Python
Python中用函数作为返回值和实现闭包的教程
Apr 27 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
python使用xlsxwriter实现有向无环图到Excel的转换
Dec 12 Python
Python实现针对json中某个关键字段进行排序操作示例
Dec 25 Python
使用Python做定时任务及时了解互联网动态
May 15 Python
Pandas分组与排序的实现
Jul 23 Python
Python操作Excel把数据分给sheet
May 20 Python
解决python调用自己文件函数/执行函数找不到包问题
Jun 01 Python
Python如何读写字节数据
Aug 05 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中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
php 防止单引号,双引号在接受页面转义
2008/07/10 PHP
php中一个完整表单处理实现代码
2011/11/10 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
php intval函数用法总结
2019/04/14 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
js replace替换字符串同时替换多个方法
2018/11/27 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
javascript获取select值的方法完整实例
2019/06/20 Javascript
Vue实现数据请求拦截
2019/10/23 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
JavaScript实现消消乐的源代码
2021/01/12 Javascript
Python去除字符串两端空格的方法
2015/05/21 Python
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
python rsa 加密解密
2017/03/20 Python
node.js获取参数的常用方法(总结)
2017/05/29 Python
python分布式环境下的限流器的示例
2017/10/26 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
用Python解数独的方法示例
2019/10/24 Python
Django model class Meta原理解析
2020/11/14 Python
综合办公室主任岗位职责
2014/04/13 职场文书
护理专业自我评价
2015/03/11 职场文书
爱国主义电影观后感
2015/06/18 职场文书
幼儿园教师培训心得体会
2016/01/21 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python
公历12个月名称的由来
2022/04/12 杂记