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 相关文章推荐
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
python实现维吉尼亚算法
Mar 20 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
Python脚本利用adb进行手机控制的方法
Jul 08 Python
Python数学形态学实例分析
Sep 06 Python
Python socket模块方法实现详解
Nov 05 Python
python字符串常用方法及文件简单读写的操作方法
Mar 04 Python
Python实现验证码识别
Jun 15 Python
如何解决pycharm调试报错的问题
Aug 06 Python
Python学习之os包使用教程详解
Mar 21 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/02/24 PHP
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
php实现转换html格式为文本格式的方法
2016/05/16 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
javascript常用方法汇总
2014/12/02 Javascript
javascript折半查找详解
2015/01/26 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
vue之浏览器存储方法封装实例
2018/03/15 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
python实现图书借阅系统
2019/02/20 Python
浅谈Python中(&,|)和(and,or)之间的区别
2019/08/07 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
关于梦想的演讲稿
2014/05/05 职场文书
标准单位租车协议书
2014/09/23 职场文书
大学生操行评语大全
2014/12/31 职场文书
学校党员干部承诺书
2015/05/04 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
Vue全家桶入门基础教程
2021/05/14 Vue.js
判断Python中的Nonetype类型
2021/05/25 Python
redis数据结构之压缩列表
2022/03/21 Redis