【问题标题】:How to create a view to encrypt a BLOB column in DB2?如何创建一个视图来加密 DB2 中的 BLOB 列?
【发布时间】: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


【解决方案1】:

您可能应该看看IBM Database Encryption Expert。您正在查看的加密/解密功能实际上并不适用于安全应用程序。

第二个可行的选择是开发external routines 来管理数据的加密和解密。可能这更便宜,但需要一些实际的开发和有关 DB2 和密码学的知识。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多