字段加密實踐(django-fernet-fields)

1、fernet介紹

  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

2、fernet使用

一、用法示例

  只需導入並使用模型中包含的字段類:加密

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

二、字段類型

  經常使用的字段類以下:EncryptedCharFieldEncryptedEmailFieldEncryptedIntegerFieldEncryptedDateField, and EncryptedDateTimeField. 全部字段類都接受與其非加密版本相同的參數blog

  要建立其餘一些自定義字段類的加密版本,能夠從EncryptedField和其餘字段類繼承:繼承

from fernet_fields import EncryptedField
from somewhere import MyField

class MyEncryptedField(EncryptedField, MyField):
    pass

三、可空字段

  容許使用可空的加密字段; NonePython中值被轉換爲NULL數據庫列中的實數請注意,這一般會在列中向攻擊者顯示數據的存在與否。若是這是您的問題,請避免使用可空的加密字段; 而是在非可空加密字段中存儲一些其餘的標記「空」值(將像任何其餘值同樣加密)。

3、索引,約束和查找

  因爲Fernet加密不是肯定性的(使用相同密鑰加密的相同源文本每次都會致使不一樣的加密令牌),所以索引或強制執行惟一性或對加密數據執行查找是無用的每一個加密值老是不一樣的,每次徹底匹配查找都會失敗; 其餘查找的結果將毫無心義。

  因爲這個緣由,若是經過了 db_index=True,unique=True,primary_key=True,EncryptedField 將拋出 django.core.exceptions.ImproperlyConfigured。而且對於 EncryptedField 的任何類型的查找。除了爲空以外,都將拋出django.core.exceptions.FieldError。 

相關文章
相關標籤/搜索