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之??碌某?? target=
Sep 12 Python
用Python的线程来解决生产者消费问题的示例
Apr 02 Python
给Python初学者的一些编程技巧
Apr 03 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
Jan 04 Python
python方法生成txt标签文件的实例代码
May 10 Python
Django中的cookie和session
Aug 27 Python
django数据模型(Model)的字段类型解析
Dec 25 Python
Python基础类继承重写实现原理解析
Apr 03 Python
django中related_name的用法说明
May 20 Python
python3.6中anaconda安装sklearn踩坑实录
Jul 28 Python
解决Jupyter-notebook不弹出默认浏览器的问题
Mar 30 Python
解决numpy和torch数据类型转化的问题
May 23 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会员权限控制实现原理分析
2011/05/29 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
JS获取Table中td值的方法
2015/03/19 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
javascript中this指向详解
2016/04/23 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
Python实现冒泡,插入,选择排序简单实例
2014/08/18 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
python实现中文文本分句的例子
2019/07/15 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
python实现的发邮件功能示例
2019/09/11 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
Python如何省略括号方法详解
2020/03/21 Python
Python网页解析器使用实例详解
2020/05/30 Python
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
日语求职信范文
2013/12/17 职场文书
个人简历自我评价
2014/01/06 职场文书
新郎婚宴答谢词
2014/01/19 职场文书
运动会开幕式邀请函
2014/01/22 职场文书
小学教师年度个人总结
2015/02/05 职场文书
大学生村官个人总结
2015/02/15 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
公司备用金管理制度
2015/08/04 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android