Есть куча этапов такого рода решений, это не просто «сунуть плагин в стек и что шифрование вещь позаботилась о»
Во-первых, вам действительно нужно классифицировать каждый столбец его привлекательность для злоумышленников &, какие поиски/запросы должны использовать его, будь то кандидат на столбец/индекс и т. д. Некоторые данные нуждаются в гораздо более сильной защите, чем другие данные.
Рассмотрит, кто вы пытаетесь защитить против:
(отверстий, например, SQL-инъекции, используемых для удаленных копий таблиц)
- Повседневного взломщика
- Украденных резервной копии базы данных (подсказка: зашифровать это тоже)
- Украдены/просочились файлы журнала, возможно включая запросы и параметры
- Атакующий с прямым доступом не на суперпользователя на уровне SQL
- Атакующие с прямым доступом суперпользователь SQL уровня
- Атакующих, который получает прямой доступ к пользователю ОС «Postgres», так что они могут изменить конфигурацию, копировать/редактировать журналы, установить вредоносные расширения, изменять определение функций и т.д.
- Attacker который получает корень на сервере БД
конечно, есть также сервер приложений, перед компромиссом доверенных источников для языков программирования и инструментальных средств и т.д. в конце концов вы достигнете точки, где вы должны сказать: «Я не могу реалистично защищаться от этого ». Вы не можете защитить кого-то, входящего, говоря: «Я из правительства, и я сделаю x/y/z вам, если вы не разрешите мне установить руткит на сервере этого клиента». Дело в том, что вам нужно решить, что вам нужно сделать, чтобы вы защищали и делали свои решения безопасности на основе этого.
Хороший компромисс может заключаться в том, чтобы максимально использовать криптографию в приложении, поэтому PostgreSQL никогда не видит ключи шифрования/дешифрования. Используйте одностороннее хеширование, когда это возможно, вместо использования обратимого шифрования, и когда вы используете хэш, должным образом солей ваши хеши.
Это значит, что pgcrypto
на самом деле вам не очень хорошо, потому что вы никогда не отправляете открытый текст на сервер, и вы также не отправляете на сервер ключевые материалы.
Это также означает, что два человека с тем же открытым текстом для столбца SecretValue имеют совершенно разные значения для SecretValueSalt, SecretValueHashedBytes
в базе данных. Таким образом, вы не можете присоединиться к нему, использовать его в статье WHERE
, полезно проиндексировать его и т. Д.
По этой причине вы часто ставите под угрозу безопасность. Вы можете сделать несостоявшийся хэш части данных, так что вы получите частичное совпадение, затем принесите все результаты в свое приложение и отфильтруйте их на стороне приложения, где у вас есть полная информация. Таким образом, ваше хранилище для SecretValue теперь выглядит как SecretValueFirst10DigitsUnsaltedHash, SecretValueHashSalt, SecretValueHashBytes
. Но с лучшими именами столбцов.
Если вы сомневаетесь, просто не отправляйте открытый текст ничего чувствительного к базе данных. Это означает, что pgcrypto
вам не очень-то нравится, и вы будете делать в основном криптографию на стороне приложения. Причина №1 заключается в том, что если вы отправляете открытый текст (или, что еще хуже, ключевой материал) в БД, он может быть открыт в файлах журналов, pg_stat_activity
и т. Д.
Вы почти всегда хотите хранить зашифрованные данные в столбцах bytea
. Если вы действительно настаиваете на том, что вы можете закодировать hex или base64 и засунуть его в столбец text
, но разработчики и администраторы баз данных, которым позже придется использовать вашу систему, будут плакать.
Всякий раз, когда вы рассматриваете криптографию, вы не можете отделить «как» от «почему». Какова ваша цель? Что вы пытаетесь защитить и * от кого? –
Основная цель - обеспечить базовую степень защиты от шифрования по этим столбцам в случае, если резервная копия базы данных «украдена» или сами файлы базы данных «украдены» с сервера. Я надеюсь, что это может быть достигнуто без чрезмерной сложности кода и при этом избежать риска непреднамеренного искажения данных с помощью ошибочных процессов шифрования. – Soferio