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 正则表达式 概述及常用字符
May 04 Python
python实现获取序列中最小的几个元素
Sep 25 Python
Python随机生成数据后插入到PostgreSQL
Jul 28 Python
Python实现的科学计算器功能示例
Aug 04 Python
python语言元素知识点详解
May 15 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
浅析PEP572: 海象运算符
Oct 15 Python
解决python replace函数替换无效问题
Jan 18 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
Apr 27 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
Python调用OpenCV实现图像平滑代码实例
Jun 19 Python
python lambda的使用详解
Feb 26 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
php curl模拟post请求小实例
2013/11/13 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
2014/09/22 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
javascript event 事件解析
2011/01/31 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
Firefox中beforeunload事件的实现缺陷浅析
2012/05/03 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
2015/11/03 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
[01:13]这,就是刀塔
2014/07/16 DOTA
人生苦短我用python python如何快速入门?
2018/03/12 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
优秀班集体先进事迹材料
2014/05/28 职场文书
中层干部培训方案
2014/06/16 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
P站美图推荐——变身女主角特辑
2022/03/20 日漫