Я пытаюсь создать представление для прозрачной обработки шифрования столбца BLOB.Я использую подход, описанный здесь .
Фон
ПРИМЕЧАНИЕ
Тамбыл комментарий @tc, спрашивающий, почему я пытаюсь зашифровать это, так как ключ шифрования затем сохраняется (в виде простого текста) в коде.У меня есть требование для шифрования данных в состоянии покоя.Поскольку приложение должно иметь возможность шифровать и дешифровать данные без вмешательства человека, ключ необходимо где-то хранить.Таким образом, он сохраняется в приложении, которое находится на другом сервере, чем база данных.Этот подход, кажется, успокаивает людей, отвечающих требованиям, но я открыт для других предложений.
Итак, вот мое определение таблицы (я использую $
в качестве символа завершения оператора):
CREATE TABLE fileAttachmentEncrypted (
work_item_id integer NOT NULL,
fileName varchar(100) NOT NULL,
documentType varchar(100) NOT NULL,
contentType varchar(100) NOT NULL,
fileImage BLOB(104857600) NOT NULL,
last_update_by varchar(20) NOT NULL,
last_update timestamp NOT NULL
)$
Этот оператор создания таблицы выполняется чисто.
Затем я пытаюсь создать свое представление:
CREATE VIEW decryptedFileAttachment AS
SELECT work_item_id, fileName, documentType, contentType,
DECRYPT_BIT(fileImage, 'SUPERSECRETPASSWORD', 'REMINDER'),
last_update_by, last_update FROM fileAttachmentEncrypted$
Задача
Это приводит к следующей ошибке:
Error: DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=DECRYPT_BIT;FUNCTION, DRIVER=3.50.152
SQLState: 42884
ErrorCode: -440
Error occured in:
CREATE VIEW decryptedFileAttachment AS
SELECT work_item_id, fileName, documentType, contentType, DECRYPT_BIT(fileImage, 'SUPERSECRETPASSWORD', 'REMINDER'), last_update_by, last_update FROM fileAttachmentEncrypted
Что я знаю до сих пор
Согласно документации DB2 это означает
SQL0440 SQLCODE -440 SQLSTATE 42884
Объяснение: Количество аргументов в CALL должно соответствовать процедуре.
Однако я не совсем уверен, что это значит.Я попытался опустить подсказку пароля, а также пароль (устанавливая его для сеанса с помощью SET ENCRYPTION PASSWORD
) для вызова DECRYPT_BIT
.
Одна из моих теорий состоит в том, что в моем определении таблицы не должно использоваться BLOBколонка.Большинство онлайн-примеров, показывающих, как реализовать шифрование на уровне столбцов в DB2, используют VARCHAR FOR BIT DATA
в качестве типа столбца, который содержит зашифрованное значение.Фактически, в документации DB2 говорится, что следует использовать это :
Когда данные зашифрованы, они сохраняются в виде строки двоичных данных.Поэтому зашифрованные данные должны храниться в столбцах, которые определены как VARCHAR FOR BIT DATA.
Однако столбцы VARCHAR имеют размер , ограниченный 32 740 байтами .Данные, которые мне нужно зашифровать, будут намного больше.
С другой стороны, эта документация подразумевает, что BLOB
- это совершенно громоздкий тип столбца для хранения зашифрованных данных:
DECRYPT_BINARY: функция DECRYPT_BINARY принимает в качестве первого аргумента большой объект encrypted_data типа BLOB или CLOB.Вы должны указать пароль в качестве второго аргумента, если только оператор SET ENCRYPTION не указал в качестве значения по умолчанию для этого сеанса тот же пароль, которым был зашифрован первый аргумент.
Верна ли эта теория?Здесь что-то еще происходит?Как я могу зашифровать свой столбец BLOB?Кто-нибудь еще в SO-сообществе реализовал шифрование на уровне столбцов в DB2?Удалось ли вам сделать это в столбце BLOB?