首页 > 其他分享 >字段加密实践(django-fernet-fields)

字段加密实践(django-fernet-fields)

时间:2022-10-20 17:02:35浏览次数:90  
标签:加密 fields django import EncryptedField fernet

一、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、字段类型

常用的字段类如下:EncryptedCharFieldEncryptedEmailFieldEncryptedIntegerFieldEncryptedDateField, 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。

标签:加密,fields,django,import,EncryptedField,fernet
From: https://www.cnblogs.com/lianhaifeng/p/16810447.html

相关文章

  • Django启动问题大杂烩
    1.ProgrammingErrorat/admin/login/(1146,"Table'mes.auth_user'doesn'texist") 解决办法:输入命令:pythonmanage.pymigrate   更新数据库表单......
  • 记录python3.7版本中 Django+celery 启动报错
     虚拟环境启动I报错Traceback(mostrecentcalllast):File"/data/.virtualenvs/cmdb/lib/python3.7/site-packages/gunicorn/arbiter.py",line589,inspawn_w......
  • Django初始化创建用户名
    (venv)D:\project\py37project\Djangopro\Procrm>Pythonmanage.pycreatesuperuser  #这是创建Django初始化用户名跟密码的一个命令。示例如下:Username(leavebla......
  • Django Rest Framework中文文档:Serializer relations
    这是对DRF官方文档:Serializerrelations的翻译,根据个人的理解对内容做了些补充、修改和整理。一,django模型间的关系在我们对数据进行建模时,最重要的一点就是根据功能需求......
  • Django环境搭建
    1、安装Django,进入到python安装目录的scripts目录下,使用命令pip3installdjango2、创建Django项目,使用命令django-adminstartproject项目名称,就会在指定文件夹下生成Djan......
  • django 数据库model取值转为字典(或json)
    ​方法一,使用model_to_dictfromdjango.forms.modelsimportmodel_to_dict​list=ProjectCase.objects.filter(prj_id=prj_id).order_by('-prc_id')​data=[]......
  • Django之form表单的数据验证
     1.先导入forms模块fromdjangoimportforms 2.创建模板的类classloginform(forms.Form):#2、模板中的元素name=forms.CharField(min_length=6,e......
  • django之五--获取url参数和name的作用
    一、前言假如我们要打开这两个地址:会发现这两个地址的最大差别就是时间参数的值是动态的(年和月的值是动态的)。那么,如果我们想要获取地址里面的【2018】和【07】这两个值,就......
  • django报错 'WSGIRequest' object has no attribute 'session'
    最新学python的django后台用到session,报错'WSGIRequest'objecthasnoattribute'session'开始以为是session问题,结果去掉session仍报类似'WSGIRequest'objecthasno......
  • 通过Python脚本在系统中操作django orm
    OK,话不多说直接上代码importosimportdjangoos.environ.setdefault('DJANGO_SETTINGS_MODULE','tunny.settings')#对应app下面的配置文件django.setup()#导......