Как я могу зашифровать/расшифровать текстовое поле на лету с помощью django
Для упрощения, у меня есть модель под названием Entry со следующими полями
- дата въезда
- description
У меня есть форма, созданная с обоими полями, сопоставленными с ней. Я хочу зашифровать поле описания при хранении в базе данных sqlite и расшифровать его при извлечении и отображении в пользовательском интерфейсе.
Я прочитал, что мне нужно создать пользовательский класс и реализовать методы шифрования и дешифрования в этом классе. Я создал пользовательский класс EncryptedDescription и добавил get_prep_value и from_db_value, которые сохраняют/извлекают новое поле из базы данных.
Но должен ли этот новый пользовательский класс (например, encrypted_description) быть дополнительным полем в моей модели Entry? Или я должен заменить поле description полем encrypted_description?
Дополнительно, как мне сопоставить этот пользовательский класс с формой модели django? Когда я пытаюсь добавить encrypted_description, он выдает ошибку "encrypted_description не может быть указан для формы модели, так как это нередактируемое поле"
Я просмотрел так много примеров, но я все еще в замешательстве относительно двух вышеупомянутых вопросов. Буду признателен за ваше руководство.
Создайте feild как @property и передайте ему setter и getter.
- Замените поле fieldName модели другим именем (_fieldName) .
- Создайте свойство fieldName как getter.
- Создайте сеттер свойства
Например
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
Для шифрования и расшифровки определенного столбца в Django можно использовать пакет django-cryptography
. Я использовал этот пакет для достижения шифрования в своем проекте. Все, что вам нужно сделать, это обернуть поле в вашей модели функцией encrypt
, и она позаботится обо всем остальном. Вы также можете использовать пользовательскую подпись и настраивать тип шифрования. Для получения дополнительной информации о том, как это сделать, обратитесь к документации.
https://django-cryptography.readthedocs.io/en/latest/installation.html