Как я могу надежно зашифровать пространственные поля (GeoDjango / PostGIS) в Django?

Я работаю над проектом Django с моделями GeoDjango, которые хранят данные о местоположении пользователя (например, PointField, LineStringField). Поскольку данные о местоположении являются очень конфиденциальными, я хочу убедиться, что они защищены (? зашифрованы) и хранятся в базе данных.

Проблема в том, что большинство библиотек шифрования полей Django (например, django-cryptography) хорошо работают со стандартными CharField или TextField, но, похоже, не поддерживают пространственные поля напрямую.

Мои требования таковы:

Мне не нужно запускать пространственные запросы в PostGIS (например, ST_Contains, ST_Distance и т.д., хотя было бы неплохо, если бы я мог поддерживать эту функциональность GeoDjango) — я могу обрабатывать геометрические операции в Python (Shapely/GEOS) после расшифровки.

Я хочу, чтобы исходные данные в базе данных были зашифрованы, чтобы администраторы базы данных не могли видеть точные координаты.

В идеале я бы хотел продолжать использовать model field API Django, чтобы сохранение / извлечение зашифрованных геометрий было естественным.

Кто-нибудь реализовал безопасный способ шифрования полей GeoDjango?

Мы были бы очень признательны за любые примеры или рекомендации!

Насколько мне известно, готового решения для шифрования в режиме ожидания с помощью PostGIS не существует. Так что, скорее всего, вы не сможете сохранить операции с ГИС, если вам нужно шифрование.

Если вас это устраивает, то остальная часть вопроса становится проще - потому что теперь вы можете использовать два FloatField и хранить их в зашифрованном виде. Чтобы сохранить API-контракт, в основном похожий на GIS, на помощь приходят наши старые друзья из ООП - разработчики и установщики.

from django.contrib.gis.geos import Point

class SomeModel:
    lat = encrypt(models.FloatField())
    lon = encrypt(models.FloatField())

    @property
    def location(self):
        return Point(self.lon, self.lat)

    @location.setter
    def location(self, point: Point):
        self.lon = point.x
        self.lat = point.y

Помимо невозможности выполнять преобразования/сравнения ГИС на уровне набора запросов, пользователи не будут знать разницы между этим и моделью, где location - это PointField.

Одно предостережение заключается в том, что это не работает "из коробки" в панели администратора, вам придется создать пользовательскую форму для взаимодействия с получателем и установщиком.

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