处理列中加密和未加密数据的混合

时间:2014-09-16 08:26:27

标签: postgresql encryption

我试图在我的Postgres网站上使用加密,但后来我又遇到了一些关于“错误:解密错误:数据不是块大小的倍数”的问题。我担心在不久的将来我可能会遇到这个问题。我注意到,当我在db上保存未加密的文本时,会发生错误。我将在我的网站上使用一些codeigniter,但问题是因为我们在团队中有七个人,可能有人会意外地没有加密并保存在数据库上。而这些问题将再次发生,当这种情况发生时,我不知道该怎么办。

我的选择是在数据库上手动删除哪些数据未加密,但问题是当发生这种情况时,如果数据库数据大约为60,000,如果我们尝试检查要删除的部分将花费我们时间确定哪些未加密。请为错误的语法提供抱歉。

使用PostgreSQL 9.3.5

我的查询代码

INSERT INTO table (text) VALUES (encrypt('my encrypt text here','secretkey','aes'));

显示查询时。

SELECT decrypt(text,'secretkey','aes') from table

但是当有人不小心插入一些没有“加密”的表时,ERROR:解密错误:数据不是块大小的倍数。任何人都可以启发我。

1 个答案:

答案 0 :(得分:2)

现在很明显,您面临的问题是如何识别未经加密的文本列中未加密或损坏的值。

没有办法区分“腐败”,“用我尝试使用的不同密钥加密”和“未加密”之间的区别,因为没有标记说“这是加密的”。这不是PostgreSQL的事情,它是大多数加密算法的工作方式,而且是设计(故意)。

您所能做的就是尝试用密钥解密它,看看是否有效。即使这远非可靠,因为值可能看起来用错误的密钥“正确”解密,并且只产生垃圾。 e.g。

regress=> SELECT encrypt(BYTEA '\xdeadbeef', 'dummykey', 'aes');
              encrypt               
------------------------------------
 \x0716fe8b280863ebf4b69b59a060c176
(1 row)

regress=> SELECT decrypt(BYTEA '\x0716fe8b280863ebf4b69b59a060c176', 'dummykey', 'aes');
  decrypt   
------------
 \xdeadbeef
(1 row)

regress=> SELECT decrypt(BYTEA '\x0716fe8b280863ebf4b69b59a060c176', 'wrong', 'aes');
              decrypt               
------------------------------------
 \xd03d4f275edf1fe058c11207527416f4
(1 row)

如果您知道自己拥有正确的密钥并且只想区分未加密和加密的数据,那么PL / PgSQL的异常处理是合适的,因为未加密的文本不太可能作为有效密钥解密。如下所示:

CREATE OR REPLACE FUNCTION try_decrypt(cyphertext bytea, secretkey bytea, algo text)
RETURNS bool
LANGUAGE plpgsql
AS $$
BEGIN
  PERFORM decrypt(cyphertext, secretkey, algo);
  RETURN true;
EXCEPTION
  WHEN external_routine_invocation_exception THEN
    RETURN false;
END;
$$;

如果你想改变上面的内容,那么如果密文不能解密就会返回密文,或者返回null,这是微不足道的。