我正在尝试创建一个透明地处理BLOB列加密的视图。我正在使用here描述的方法。
背景
注
@tc有评论,问为什么 我试图加密这个,因为 然后存储加密密钥(in 纯文本)在代码中。我有一个 要求加密数据 在休息。由于应用程序需要 能够加密和解密 数据,没有人为干预, 密钥需要存储在某个地方。这个 方式,它存储在应用程序中, 这是在不同的服务器上 数据库。这种方法似乎 安抚合规伙伴,但我是 对其他建议持开放态度。
所以,这是我的表定义(我使用$
作为语句终止字符):
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 documentation,这意味着
SQL0440 SQLCODE -440 SQLSTATE 42884
说明:关于的参数数量 CALL必须与程序匹配。
但是,我不确定这意味着什么。我尝试省略密码提示以及密码(使用SET ENCRYPTION PASSWORD
为会话设置)以进行DECRYPT_BIT
调用。
我的一个理论是我的表定义不应该使用BLOB列。在线显示如何在DB2中实现列级加密的大多数示例都使用VARCHAR FOR BIT DATA
作为保存加密值的列类型。实际上,DB2 documentation says to use this:
数据加密后会存储 作为二进制数据字符串。因此, 加密数据应存储在 定义为VARCHAR的列 对于比特数据。
但是,VARCHAR列为limited to 32,740 bytes。我需要加密的数据会大得多。
另一方面,this documentation表示BLOB
是用于保存加密数据的完美的列式类型:
DECRYPT_BINARY:DECRYPT_BINARY 函数接受作为其第一个参数 一个encrypted_data类型的大对象 BLOB或CLOB。你必须指定一个 密码作为其第二个参数, 除非SET ENCRYPTION语句 已指定为此默认值 会话使用相同的密码 第一个参数是加密的。
这个理论是否正确?还有其他事情发生在这里吗?如何加密我的BLOB列? SO社区中的其他任何人是否在DB2中实现了列级加密?你能在BLOB专栏上做到吗?
答案 0 :(得分:0)
你应该看一下IBM Database Encryption Expert。您正在查看的加密/解密功能实际上并不适用于安全应用程序。
第二个可行的选择可能是开发external routines来管理数据的加密和解密。可能更便宜但需要一些关于DB2和加密的实际开发和知识。