django fernet fields字段加密實踐詳解
一、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字段的值,但是這些值在發(fā)送到數據庫之前會自動進行加密,并在數據庫中讀取時進行解密。
加密和解密都將在本地應用中執(zhí)行,密鑰永遠不會發(fā)送到數據庫服務器,數據庫僅查看此字段的加密值。
2、字段類型
常用的字段類如下:EncryptedCharField, EncryptedEmailField, EncryptedIntegerField, EncryptedDateField, and EncryptedDateTimeField. 所有字段類都接受與其非加密版本相同的參數。
要創(chuàng)建其他一些自定義字段類的加密版本,可以從EncryptedField和其他字段類繼承:
from fernet_fields import EncryptedField from somewhere import MyField class MyEncryptedField(EncryptedField, MyField): pass
3、可空字段
允許使用可空的加密字段; NonePython中的值被轉換為NULL數據庫列中的實數。請注意,這通常會在列中向攻擊者顯示數據的存在與否。如果這是您的問題,請避免使用可空的加密字段; 而是在非可空加密字段中存儲一些其他的標記“空”值(將像任何其他值一樣加密)。
三、索引,約束和查找
由于Fernet加密不是確定性的(使用相同密鑰加密的相同源文本每次都會導致不同的加密令牌),因此索引或強制執(zhí)行唯一性或對加密數據執(zhí)行查找是無用的。每個加密值總是不同的,每次完全匹配查找都會失敗; 其他查找的結果將毫無意義。
由于這個原因,如果通過了 db_index=True,unique=True,primary_key=True,EncryptedField 將拋出 django.core.exceptions.ImproperlyConfigured。并且對于 EncryptedField 的任何類型的查找。除了為空之外,都將拋出django.core.exceptions.FieldError。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
不歸路系列:Python入門之旅-一定要注意縮進?。。。ㄍ扑])
這篇文章主要介紹了Python入門一定要注意縮進,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04淺談pytorch中的nn.Sequential(*net[3: 5])是啥意思
這篇文章主要介紹了pytorch中的nn.Sequential(*net[3: 5])是啥意思,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04