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 open读写文件实现脚本
Sep 06 Python
Python自定义scrapy中间模块避免重复采集的方法
Apr 07 Python
Python利用Nagios增加微信报警通知的功能
Feb 18 Python
浅析Python中的for 循环
Jun 09 Python
python opencv之分水岭算法示例
Feb 24 Python
python利用微信公众号实现报警功能
Jun 10 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 Python
tensorflow的计算图总结
Jan 12 Python
Python Scrapy框架第一个入门程序示例
Feb 05 Python
解决jupyter notebook 出现In[*]的问题
Apr 13 Python
Python基于Socket实现简易多人聊天室的示例代码
Nov 29 Python
python用分数表示矩阵的方法实例
Jan 11 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
php 获取可变函数参数的函数
2009/08/26 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
JavaScript和CSS通过expression实现Table居中显示
2013/06/28 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
一秒学会微信小程序制作table表格
2019/02/14 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
Python3基础之list列表实例解析
2014/08/13 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
python如何通过闭包实现计算器的功能
2020/02/22 Python
python实现扫雷游戏
2020/03/03 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
python的scipy.stats模块中正态分布常用函数总结
2021/02/19 Python
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
自考生自我评价分享
2014/01/18 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
详解Redis基本命令与使用场景
2021/06/01 Redis
Python 中random 库的详细使用
2021/06/03 Python
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android