Hi,
I need to encrypt some fields in my database. The solution I came up with
is:
- create an additional field w/suffix "_encr" for every field which must be
encrypted;
- create update triggers which write the encrypted value into the new field
and null into the original field (not null constraints must be removed, of
course)
- change the views to use and decrypt the encrypted fields.
- add polymorpic encrypt(...) functions which are distinguished from their
argument types and take the key from a temporary table.
I'm pretty sure I need to use BYTEA fields to store the encrypted values;
and I need to convert TEXT <--> BYTEA, don't I?
So I created the following functions:
REATE OR REPLACE FUNCTION text2bytea(text)
RETURNS bytea AS
$BODY$BEGIN
RETURN decode($1, 'escape');
END;$BODY$
LANGUAGE 'plpgsql' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION bytea2text(bytea)
RETURNS text AS
$BODY$BEGIN
RETURN encode($1, 'escape');
END;$BODY$
LANGUAGE 'plpgsql' IMMUTABLE STRICT;
ALTER FUNCTION text2bytea(text) OWNER TO postgres;
Now, unfortunately there are backslashes in many varchar fields in the rows
wich must be encrypted; and for those strings, encode/decode seems to crash:
select decode('abc', 'escape'); -- yields 'abc'
select decode('ab\c', 'escape'); -- yields 'abc'
select encode('ab\c', 'escape'); -- yields 'abc'
select decode('ab\\c', 'escape'); -- ERROR: invalid input syntax for type
bytea
select encode('ab\\c', 'escape'); -- ERROR: invalid input syntax for type
bytea
select decode('ab\\\\c', 'escape'); -- yields 'ab\\c'
select encode('ab\\\\c', 'escape'); -- yields 'ab\\c'
This looks to me like a bug: the backslash should be escaped with another
backslash instead of raising an error.
Any ideas how to get around this?
--
TIA,
Tobias