【发布时间】:2010-08-19 17:40:35
【问题描述】:
我正在尝试创建一个视图来透明地处理 BLOB 列的加密。我正在使用here 描述的方法。
背景
注意
@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 documentation,这意味着
SQL0440 SQLCODE -440 SQLSTATE 42884
解释:参数个数 CALL 必须匹配过程。
但是,我不确定这意味着什么。我尝试为DECRYPT_BIT 调用省略密码提示以及密码(使用SET ENCRYPTION PASSWORD 为会话设置)。
我的一个理论是我的表定义不应该使用 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 语句 已指定为此的默认值 session 使用相同的密码 第一个参数已加密。
这个理论正确吗?这里还有其他事情吗?如何加密我的 BLOB 列? SO 社区中的其他人是否在 DB2 中实现了列级加密?你能在 BLOB 列上做到这一点吗?
【问题讨论】:
-
为什么要“加密”一列,然后将密钥存储在源代码中?
-
我需要加密静态数据。由于应用程序需要能够在没有人为干预的情况下加密和解密数据,因此需要将密钥存储在某个地方。这样,它就存储在与数据库不同的服务器上的应用程序中。这种方法似乎可以安抚合规人员,但我愿意接受其他建议。
标签: encryption views db2