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调用浏览器并打开一个网址的例子
Jun 05 Python
在Python中进行自动化单元测试的教程
Apr 15 Python
Python运算符重载用法实例分析
Jun 01 Python
使用PyCharm配合部署Python的Django框架的配置纪实
Nov 19 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
Python通用函数实现数组计算的方法
Jun 13 Python
python Tkinter的图片刷新实例
Jun 14 Python
详解pytorch 0.4.0迁移指南
Jun 16 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
May 09 Python
keras中的loss、optimizer、metrics用法
Jun 15 Python
用python实现监控视频人数统计
May 21 Python
Python+SeaTable实现计算两个日期间的工作日天数
Jul 07 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中计算时间差的方法
2011/04/22 PHP
PHP静态成员变量
2017/02/14 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
ext 代码生成器
2009/08/07 Javascript
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
2020/04/18 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
Python读写配置文件的方法
2015/06/03 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
python将回车作为输入内容的实例
2018/06/23 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
python 操作hive pyhs2方式
2019/12/21 Python
Python基于class()实现面向对象原理详解
2020/03/26 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
Python字典取键、值对的方法步骤
2020/09/30 Python
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
求职推荐信
2013/10/28 职场文书
小班重阳节活动方案
2014/02/08 职场文书
优秀家长事迹材料
2014/05/17 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
党的群众路线教育实践活动教师自我剖析材料
2014/10/09 职场文书
2015毕业生实习期工作总结
2015/04/09 职场文书
昆虫记读书笔记
2015/06/26 职场文书
治庸问责工作总结
2015/08/11 职场文书
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server