Как я могу зашифровать/расшифровать текстовое поле на лету с помощью 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.

  1. Замените поле fieldName модели другим именем (_fieldName)
  2. .
  3. Создайте свойство fieldName как getter.
  4. Создайте сеттер свойства

Например

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

Вернуться на верх