Пользовательское поле Django - получить поле модели из метода to_python - PullRequest
1 голос
/ 31 октября 2011

Обновлено

У меня есть следующий класс настраиваемых полей:

class Binary(models.Field):
    __metaclass__ = models.SubfieldBase
    def get_prep_value(self, value):
       return encryptAES(key, iv_random, str(value))
    def to_python(self, value):
       return value
    def db_type(self, connection):
       return 'VARBINARY(900)'

Это моя модель:

class Received(models.Model):
   user = models.ForeignKey(User, unique=False, editable=False)
   address = Binary(blank=True)
   aes_key = Binary(blank=True)
   iv = Binary(blank=True)      

Я пытаюсь зашифровать / расшифроватьданные с использованием пользовательского поля класса.Когда пользователь отправляет форму, метод get_prep_value должен зашифровать данные.В интерфейсе администратора Django мне нужен метод to_python для расшифровки полей данных в представлении изменений.Я думал сделать следующие дополнения к методу to_python:

def to_python(self, value):
        return decryptAES(aes_key?, iv?, value)

Проблема, с которой я столкнулся, заключается в том, что метод to_python просматривает значения каждого поля в отдельности, тогда как мне нужны значения самого поля,включая поля aes_key и iv для расшифровки данных.Я не знаю, как получить поля aes_key и iv, отсюда и вопросительные знаки.

Надеюсь, это прояснит ситуацию.

Ответы [ 2 ]

1 голос
/ 31 октября 2011

Исходя из обновления вашего вопроса, то, что вы пытаетесь сделать, на самом деле неосуществимо. Если вы хотите, чтобы поле могло автоматически шифровать / дешифровать, то вся информация, необходимая для этого, должна храниться в соответствующем поле базы данных (см. Ответ @ DanielRoseman). Это по существу сводит на нет полезность шифрования, если ваша база данных когда-либо скомпрометирована. Хотя, я полагаю, злоумышленнику все равно придется сообразить, как правильно собрать его воедино.

Абсолютно невозможно хранить необходимую информацию в нескольких полях базы данных, но есть одно поле, которое объединяет всю информацию для дешифрования. Поля являются изолированными объектами. Очевидно, что им не разрешается иметь какую-либо информацию о других полях модели, поскольку они могут использоваться в тех местах, где эти другие поля могут отсутствовать в модели.

Лучше всего хранить зашифрованное значение и информацию, необходимую для его расшифровки, в стандартных полях модели Django, и иметь один метод модели, который расшифровывает значение, а другой - не шифрование значения.

0 голосов
/ 01 ноября 2011

Если key, iv_random и name необходимы для этого поля для шифрования и дешифрования при входе и выходе из базы данных, то они вообще не должны быть отдельными полями - вместо этого вы должен определить этот Binary класс (ужасное имя, кстати), чтобы он генерировал / принимал последовательность из трех значений.

...