Fernet 用於django模型字段對稱加密,使用 crytography 庫。數據庫
官網幫助文檔django
django-fernet-fields 支持Django 1.8.2以及更高版本,Python 2.七、3.三、3.四、pypy和pypy3。後端
測試了PostgreSQL、SQLite和MySQL可用,可是任何支持BinaryField的Django數據庫後端應該均可以運行。服務器
django-fernet-fields 在 PyPI可用,可用以下方法安裝:測試
pip install django-fernet-fields
只需導入並使用模型中包含的字段類:加密
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字段的值,可是這些值在發送到數據庫以前會自動進行加密,並在數據庫中讀取時進行解密。spa
加密和解密都將在本地應用中執行,密鑰永遠不會發送到數據庫服務器,數據庫僅查看此字段的加密值。code
經常使用的字段類以下:EncryptedCharField
, EncryptedEmailField
, EncryptedIntegerField
, EncryptedDateField
, and EncryptedDateTimeField
. 全部字段類都接受與其非加密版本相同的參數。blog
要建立其餘一些自定義字段類的加密版本,能夠從EncryptedField和其餘字段類繼承:繼承
from fernet_fields import EncryptedField from somewhere import MyField class MyEncryptedField(EncryptedField, MyField): pass
容許使用可空的加密字段; None
Python中的值被轉換爲NULL
數據庫列中的實數。請注意,這一般會在列中向攻擊者顯示數據的存在與否。若是這是您的問題,請避免使用可空的加密字段; 而是在非可空加密字段中存儲一些其餘的標記「空」值(將像任何其餘值同樣加密)。
因爲Fernet加密不是肯定性的(使用相同密鑰加密的相同源文本每次都會致使不一樣的加密令牌),所以索引或強制執行惟一性或對加密數據執行查找是無用的。每一個加密值老是不一樣的,每次徹底匹配查找都會失敗; 其餘查找的結果將毫無心義。
因爲這個緣由,若是經過了 db_index=True,unique=True,primary_key=True,EncryptedField
將拋出 django.core.exceptions.ImproperlyConfigured。而且對於 EncryptedField 的任何類型的查找。除了爲空以外,都將拋出django.core.exceptions.FieldError。