Thread: Problems with pgcrypto and special characters
Hello! To get straight to the point, here's my problem: mypgdb=# select bytea2text(decrypt(encrypt('Tübingen'::bytea, 'mypassphrase'::bytea,'bf'::text),'mypassphrase'::bytea,'bf'::text))as foo; foo ----------------- T\303\274bingen (1 row) I have compiled and installed pg_crypto and I'am using the following function as workaround for a bytea-to-text-cast: create or replace function bytea2text(bytea) returns text as ' begin return $1; end; ' language plpgsql; The cluster was initialized with locale de_DE.UTF-8, pg_controldata confirms: LC_COLLATE: de_DE.UTF-8 LC_CTYPE: de_DE.UTF-8 Database version is PostgreSQL 8.0.1 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.2 I think I'm missing something very obvious here, so please give me a hint: How can I use pgcrypto to encrypt and decrypttext which contains UTF-8 special characters like german umlauts? I think that this simple bytea2text-function probablyneeds a replacement, but I haven't got the faintest clue about how to actually retrieve the original input afterencryption. Any help would be tremendously appreciated :) Thanks in advance! Kind regards Markus
On Mon, 2005-02-28 at 18:32 +0100, Markus Wollny wrote: > To get straight to the point, here's my problem: > > mypgdb=# select bytea2text(decrypt(encrypt('Tübingen'::bytea, 'mypassphrase'::bytea,'bf'::text),'mypassphrase'::bytea,'bf'::text))as foo; > foo > ----------------- > T\303\274bingen > (1 row) > > I have compiled and installed pg_crypto and I'am using the following function as workaround for a bytea-to-text-cast: are you sure your problem is with pg_crypto ? what does this produce: select bytea2text('Tübingen'::bytea) as foo; ? have you tried to use encode()/decode() instead ? untested: select decode( decrypt( encrypt( encode('Tübingen','escape') , 'mypassphrase'::bytea, 'bf'::text ), 'mypassphrase'::bytea, 'bf'::text ) ) as foo; (sorry for the obsessive indentation) gnari
"Markus Wollny" <Markus.Wollny@computec.de> writes: > ... I'am using the following function as workaround for a bytea-to-text-cast: > create or replace function bytea2text(bytea) returns text as ' > begin > return $1; > end; > ' language plpgsql; That looks like your problem right there. Possibly a binary cast (WITHOUT FUNCTION) would solve your problem, though I doubt it will work well on bytea values containing \0. regards, tom lane
Hi! -----Original Message----- From: Ragnar Hafstað [mailto:gnari@simnet.is] >are you sure your problem is with pg_crypto ? >what does this produce: > select bytea2text('Tübingen'::bytea) as foo; >? Well I'm sure it's not WITH pgcrypto but with actually using pgcrypto in conjunction with UTF-8 encoded text. This functiondoesn't do anything but replace a bytea::text-cast. >have you tried to use encode()/decode() instead ? >untested: > select > decode( > decrypt( > encrypt( > encode('Tübingen','escape') , > 'mypassphrase'::bytea, > 'bf'::text > ), > 'mypassphrase'::bytea, > 'bf'::text > ) > ) as foo; Yes, and that doesn't work either: mypgdb=# select decode(encode('Tübingen'::text::bytea,'escape'),'escape'); decode ----------------- T\303\274bingen (1 row) But I just found the bugger - we both confused encode and decode :) mypgdb=# select encode(decode('Tübingen','escape'),'escape'); encode ---------- Tübingen (1 row) Now using pgcrypto works, too: mypgdb=# select encode(decrypt(encrypt(decode('Tübingen'::text,'escape'),'mypassphrase','bf'),'mypassphrase','bf'),'escape'); encode ---------- Tübingen (1 row) Thanks nevertheless, this was exactly the push in the right direction that I needed! Kind regards Markus
Hi! -----Original Message----- From: Tom Lane [mailto:tgl@sss.pgh.pa.us] > Possibly a binary cast (WITHOUT FUNCTION) would solve your problem, > though I doubt it will work well on bytea values containing \0. Thanks, I've been a bit thick here, but I just found the solution to my problem - and that doesn't need this awkward functionnor any type of extra WITHOUT FUNCTION casts - just decode and encode, alas in exactly the opposite order than Ioriginally expected. mypgdb=# select decode('Tübingen'::text,'escape'); decode ----------------- T\303\274bingen (1 row) mypgdbe=# select encode('T\303\274bingen','escape'); encode ---------- Tübingen (1 row) I think this should be safe for any kind of bytea value. Kind regards Markus