3

我正在使用 PostgreSQL 8.4,并使用pgp_sym_encryptpgcrypto 扩展中的函数在插入时加密数据。所以我的插入查询看起来像:

insert into myTable (
                     column1
                    ,column2
                     ) 
values (
        pgp_sym_encrypt('value1','key')
       ,pgp_sym_encrypt('value1','key')
       );

我在表中的 column1 上应用了主键约束,但约束并不总是检测到插入已经存在的值,因为对于相同的解密值,加密数据并不总是相同的。

问题 :

如何应用此约束以检查解密数据是否匹配并且在这种情况下不允许插入?

4

1 回答 1

4

如果您希望强制执行唯一性,最好的办法是散列您的信息并将该散列存储在具有唯一索引的单独列中,我经常使用摘要来检查较长文本的唯一性,这纯粹是因为它的空间要求很小,但是由于散列的不可逆性质,其余部分应该是不可发现的。首先你需要一个列:

alter table myTable add column column3 bytea unique;

然后为您的插入只包括第 3 列

insert into myTable(
column1
,column2
,column3
)
values (
pgp_sym_encrypt('value1','key')
,pgp_sym_encrypt('value1','key')
,digest('value1', 'sha256')
)

sha256 应该很容易混淆数据,以至于以这种形式存储的任何内容都不会被成功破译,并且在二进制列中只需要 32 个字节,加上索引。作为记录,不同哈希的数据长度为:

select length(digest('your message goes here', 'sha1'));
-- 20
select length(digest('your message goes here', 'sha256'));
-- 32
select length(digest('your message goes here', 'sha512'));
-- 64

最后,你是用'key'加密'value1'两次还是它们是两条独立的信息?我猜它们应该是两个不同的数据列,如果是这样并且您需要两者的唯一性,那么您当然需要创建另一个列并对其进行哈希处理。

于 2015-01-17T12:21:00.893 回答