Я пытался найти хороший способ зашифровать чувствительные столбцы в моей БД. Я думал, что встроенные механизмы шифрования SQL Server помогут, но я либо что-то упустил, либо сделал неправильно.
Первоначально планировалось создать таблицу со столбцами, которые были зашифрованы с помощью симметричного ключа, и иметь представление для выбора данных из таблицы в незашифрованном виде. Однако я не смог понять, как использовать метод DecryptByKey в операторе выбора представления. Плюс ко всему, мне пришло в голову, что данные будут незашифрованными во время и из представления, поэтому, если соединение не было защищенным, то это будет бессмысленно.
Тогда я подумал о том, чтобы перенести все шифрование / дешифрование в мое приложение. Я понял, что
Если БД была полностью неспособна дешифровать свои собственные данные, то кто-то, внедрившийся в БД, вообще не смог бы многое сделать.
Это избавит сервер от попыток расшифровать / зашифровать информацию, поскольку шифрование / дешифрование в БД может повлиять на производительность в глобальном масштабе, а не только на одной рабочей станции.
Итак, мое приложение имеет жестко закодированные IV и ключи для каждого столбца, который необходимо зашифровать. Он отправляет зашифрованную информацию в БД и получает зашифрованную информацию из БД. Это просто для того, чтобы возиться с тобой, я знаю, что я должен поместить IV и ключи в другое место ... они просто небезопасны в коде приложения.
Я думал об этой безумной идее:
Клиентское приложение будет содержать один ключ и IV. Сервер будет содержать ключи / IV всех зашифрованных столбцов в одной таблице. Однако значения ключей / IV будут зашифрованы ключом / IV, который хранится в клиентском приложении.
При запуске клиентское приложение загружает все ключи / IV из БД в память и расшифровывает их по мере необходимости для просмотра данных, выбранных с сервера.
Также может существовать связь, которая объединит пользователей с ключами, которые им разрешено использовать. Таким образом, приложение будет дешифровать только те столбцы, которые пользователь имеет право просматривать.
Как вы думаете, идея выиграна или проиграна? И как некоторые из вас реализовали шифрование в сценарии клиент-приложение / SQL Server?