Как создать представление для шифрования BLOB-столбца в DB2? - PullRequest
0 голосов
/ 19 августа 2010

Я пытаюсь создать представление для прозрачной обработки шифрования столбца 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?

1 Ответ

0 голосов
/ 06 февраля 2011

Вам, вероятно, стоит взглянуть на IBM Database Encryption Expert . Функции шифрования / дешифрования, которые вы просматриваете, на самом деле не предназначены для приложений безопасности.

Вторым жизнеспособным вариантом может быть разработка внешних подпрограмм для управления шифрованием и дешифрованием данных. Возможно, это дешевле, но требует некоторой разработки и знаний как о DB2, так и о криптографии.

...