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 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
使用Python的Zato发送AMQP消息的教程
Apr 16 Python
解析Python编程中的包结构
Oct 25 Python
Python 3中的yield from语法详解
Jan 18 Python
使用Python实现博客上进行自动翻页
Aug 23 Python
Python实现Pig Latin小游戏实例代码
Feb 02 Python
python定向爬取淘宝商品价格
Feb 27 Python
flask session组件的使用示例
Dec 25 Python
keras 特征图可视化实例(中间层)
Jan 24 Python
python图形开发GUI库pyqt5的基本使用方法详解
Feb 14 Python
Anconda环境下Vscode安装Python的方法详解
Mar 29 Python
Python调用OpenCV实现图像平滑代码实例
Jun 19 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图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
php面象对象数据库操作类实例
2014/12/02 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
多个jQuery版本共存的处理方案
2015/03/17 Javascript
解析Node.js基于模块和包的代码部署方式
2016/02/16 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
vue注册组件的几种方式总结
2018/03/08 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
前端防止用户重复提交js实现代码示例
2018/09/07 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
在JavaScript中使用严格模式(Strict Mode)
2019/06/13 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
python 根据pid杀死相应进程的方法
2017/01/16 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
Python判断有效的数独算法示例
2019/02/23 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
如何提高SQL Server的安全性
2016/07/25 面试题
保洁主管岗位职责
2013/11/20 职场文书
信息专业学生学习的自我评价
2014/02/17 职场文书
有关爱国演讲稿
2014/05/07 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
Django如何与Ajax交互
2021/04/29 Python
浅谈Python协程asyncio
2021/06/20 Python
python神经网络ResNet50模型
2022/05/06 Python