Как я могу надежно зашифровать пространственные поля (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
.
Одно предостережение заключается в том, что это не работает "из коробки" в панели администратора, вам придется создать пользовательскую форму для взаимодействия с получателем и установщиком.