如何使用django动态加密/解密文本字段



为了简化,我有一个名为Entry的模型,其中包含以下字段

  • 入口日期
  • 说明

我创建了一个表单,两个字段都映射到它。我想在存储在sqlite数据库中时加密描述字段,并在检索和显示给用户界面时解密它。

我读到我需要创建一个自定义类,并在该类中实现加密和解密方法。我创建了一个名为EncryptedDescription的自定义类,并添加了get_prep_value和from_db_value,用于保存/检索数据库中的新字段。

但是这个新的自定义类(例如encrypted_description(应该是我的Entry模型中的一个附加字段吗?还是应该将描述字段替换为encrypted_description字段?

此外,如何将这个自定义类映射到django模型表单?当我尝试添加encrypted_description时,它会给我一个错误";encrypted_description不能为模型形式指定,因为它是不可编辑的字段";

我浏览了很多例子,但我仍然对以上两个问题感到困惑。感谢您的指导。

要加密和解密Django中的特定列,可以使用django-cryptography包。我在我的项目中使用了这个包来实现加密。你所需要做的就是用encrypt函数包装模型中的字段,它会处理剩下的部分。你还可以使用自定义签名和自定义加密类型。有关如何执行此操作的更多信息,请参阅文档。

https://django-cryptography.readthedocs.io/en/latest/installation.html

将feild创建为@property并覆盖setter和getter。

  1. 将模型fieldName替换为其他名称(_fieldName(
  2. 将fieldName属性创建为getter
  3. 创建属性设置器

例如

class MyModel:
def __init__(self):
self.entry_date = models.DateField()
self._description = models.TextField(db_column='description')
@property
def description(self):
# Decrypt the value of self._description and return
val = decrypt(self._description)
return val
@description.setter
def description(self, val):
# Encrypt val and update self._description value
enc_val = encrypt(val)
self._description = enc_val

最新更新