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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 Python
Python封装shell命令实例分析
May 05 Python
Python爬虫实战之12306抢票开源
Jan 24 Python
利用Python实现微信找房机器人实例教程
Mar 10 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
vscode 配置 python3开发环境的方法
Sep 19 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
Keras模型转成tensorflow的.pb操作
Jul 06 Python
Pycharm配置autopep8实现流程解析
Nov 28 Python
python实现马丁策略回测3000只股票的实例代码
Jan 22 Python
分享Python获取本机IP地址的几种方法
Mar 17 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
咖啡冲泡指南 咖啡有哪些制作方式 单品咖啡 意式咖啡
2021/03/06 冲泡冲煮
php文件夹的创建与删除方法
2015/01/24 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
Jquery之美中不足小结
2011/02/16 Javascript
js实现日期级联效果
2014/01/23 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
深入理解Angularjs中$http.post与$.post
2017/05/19 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
2019/04/10 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
浅谈Vue SSR中的Bundle的具有使用
2019/11/21 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
python之Socket网络编程详解
2016/09/29 Python
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
基于python实现从尾到头打印链表
2019/11/02 Python
python turtle 绘制太极图的实例
2019/12/18 Python
python unichr函数知识点总结
2020/12/16 Python
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
医学生求职自荐书
2014/06/12 职场文书
入党个人总结范文
2015/03/02 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
Go 在 MongoDB 中常用查询与修改的操作
2021/05/07 Golang
尝试使用Python爬取城市租房信息
2022/04/12 Python