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基于pygame实现的font游戏字体(附源码)
Nov 11 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
Python探索之ModelForm代码详解
Oct 26 Python
人工智能最火编程语言 Python大战Java!
Nov 13 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
python 实现识别图片上的数字
Jul 30 Python
Python加密模块的hashlib,hmac模块使用解析
Jan 02 Python
opencv之颜色过滤只留下图片中的红色区域操作
Jun 05 Python
python如何实现DES加密
Sep 21 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 Python
Python中的xlrd模块使用整理
Jun 15 Python
python数字图像处理数据类型及颜色空间转换
Jun 28 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实现httpclient类示例
2014/04/08 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
Javascript引用指针使用介绍
2012/11/07 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
AngularJS 仿微信图片手势缩放的实例
2017/09/28 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
实例详解带参数的 npm script
2019/05/28 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
Python运算符重载详解及实例代码
2017/03/07 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
django 修改server端口号的方法
2018/05/14 Python
PyCharm 设置SciView工具窗口的方法
2019/01/15 Python
如何运行带参数的python脚本
2019/11/15 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
城市规划毕业生求职信
2013/10/10 职场文书
毕业生实习鉴定
2013/12/11 职场文书
讲座主持词
2014/03/20 职场文书
12岁生日演讲稿
2014/05/14 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
社保委托书怎么写
2014/08/02 职场文书
MySQL锁机制
2021/04/05 MySQL