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 21 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
Apr 10 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
Python列表与元组的异同详解
Jul 02 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
Dec 13 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
Jan 10 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
PyTorch中的C++扩展实现
Apr 02 Python
用python实现学生管理系统
Jul 24 Python
基于python实现操作git过程代码解析
Jul 27 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 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
smarty简单分页的实现方法
2014/10/27 PHP
学习php设计模式 php实现备忘录模式(Memento)
2015/12/09 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
JavaScript实现点击按钮就复制当前网址
2015/12/14 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
微信小程序 教程之注册程序
2016/10/17 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
2017/02/12 Javascript
js获取ip和地区
2017/03/10 Javascript
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
一秒学会微信小程序制作table表格
2019/02/14 Javascript
js实现打字小游戏
2019/12/17 Javascript
python实现给字典添加条目的方法
2014/09/25 Python
python网络编程之数据传输UDP实例分析
2015/05/20 Python
Python内置函数delattr的具体用法
2017/11/23 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
Django之模板层的实现代码
2019/09/09 Python
Python集合基本概念与相关操作实例分析
2019/10/30 Python
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
中职应届生会计求职信
2013/10/23 职场文书
管理专员自荐信
2014/01/26 职场文书
《三峡》教学反思
2014/03/01 职场文书
cf收人广告词大全
2014/03/14 职场文书
医院院务公开实施方案
2014/05/03 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
学生检讨书怎么写
2014/10/09 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书