我试图在我的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:解密错误:数据不是块大小的倍数。任何人都可以启发我。
答案 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,这是微不足道的。