Re: problema con codificacion

From: Anthony Sotolongo <asotolongo(at)gmail(dot)com>
To: Francisco Olarte <folarte(at)peoplecall(dot)com>, Esneiker Enriquez Cabrera <eenriquez(at)cav(dot)desoft(dot)cu>
Cc: Lista Postgres ES <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: problema con codificacion
Date: 2015-11-13 17:15:58
Message-ID: 56461ACE.6080707@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola, asegurarte de tener el SET CLIENT_ENCODING TO 'UTF8', pues a veces
un cliente de un tipo de codificación y el servidor de otra puede traer
sus problemas y lo que te comenta Fransico funciona:

select
convert_from(decrypt(encrypt('telefónico','password','3dES'),'password','3dES'::text),
'UTF-8');

convert_from
--------------
telefónico
(1 row)

El 13/11/15 a las 14:05, Francisco Olarte escribió:
> 2015-11-13 21:53 GMT+01:00 Esneiker Enriquez Cabrera <eenriquez(at)cav(dot)desoft(dot)cu>:
>> Escribo porque estoy probando guardar información encriptada en la base de
>> datos con codificación utf8 y todo resulta bien, excepto cuando la
>> información tiene caracteres especiales, se guarda basura.
>> A continuación les pongo un ejemplo.
>> select
>> encode(decrypt(encrypt('telefónico','password','3des'),'password','3des'::text),
>> 'escape'::text);
>> el resultado que me retorna es “telef\303\263nico”, en lugar de telefónico.
>> Espero que me puedan indicar cómo hacer el tratamiento correcto.
> Esto huele a lo de siempre, UTF-8 es una forma de codificar texto en
> bytes, la criptografia va en bytes, tenemos el encoding de la base de
> datos por un lado, nos hemos liado.etc etc...
>
> No te lo puedo asegurar, pero el hecho de que necesites encode ya te
> da una pista. Encrypt toma bytea como datos, PEEERO, tu le has dado un
> texto fiandote de la conversion por defecto, decrypt devuelve bytea.
> Luego coges y le dices que te lo imprima en escape, y lo hace bien, de
> hecho :
>
> cdrs=> show client_encoding;
> client_encoding
> -----------------
> UTF8
> (1 row)
>
> cdrs=> select encode('telefónico', 'escape');
> encode
> -------------------
> telef\303\263nico
> (1 row)
>
> El problema es que el decrypt/encrypt es el equivalente a pasat
> telefónico a bytea:
>
>
> cdrs=> select 'telefónico'::bytea;
> bytea
> --------------------------
> \x74656c6566c3b36e69636f
> (1 row)
>
> cdrs=> select encode('telefónico'::bytea, 'escape');
> encode
> -------------------
> telef\303\263nico
> (1 row)
>
> Y lo que tu quieres es que te interprete esos bytes como utf8, no que
> te los imprima escapados, para eso necesitarias una funcion de
> conversion de bytes a string, como por ejemplo:
>
> cdrs=> select convert_from('telefónico'::bytea, 'UTF-8');
> convert_from
> --------------
> telefónico
> (1 row)
>
> No te lo puedo probar porque no tengo instaladas las crypto, pero
> juraria que es eso.
>
> Por cierto, si lo es tu codigo tiene un problema, que dejas la
> conversion de texto a bytea a merced del encoding de la conexion y
> otroas cosas, lo que no es recomendable, particularmente en
> criptografia. Probablement tus problemas vienen de que la conversion
> no es reversible:
>
>
> cdrs=> select 'telefónico'::bytea::text;
> text
> --------------------------
> \x74656c6566c3b36e69636f
> (1 row)
>
> Las cosas te iran mejor/mas simples, si al igual que apareas
> encrypt/decrypt haces lo mismo con convert_from, convert_to, asi te
> aseguras de que lo hace en el encoding que tu le dices
> independientemente de la conexion:
>
> cdrs=> select convert_from(convert_to('telefónico','UTF-8'), 'UTF-8');
> convert_from
> --------------
> telefónico
> (1 row)
>
> Que funciona con otros encoding ( que soporten los caracteres que usas ):
>
> cdrs=> select convert_from(convert_to('telefónico','LATIN-1'), 'LATIN-1');
> convert_from
> --------------
> telefónico
> (1 row)
>
> A pesar de que:
>
>
>
> cdrs=> values(convert_to('telefónico','LATIN-1'), 'LATIN-1') union
> values(convert_to('telefónico','UTF-8'), 'UTF-8');
> column1 | column2
> --------------------------+---------
> \x74656c6566c3b36e69636f | UTF-8
> \x74656c6566f36e69636f | LATIN-1
> (2 rows)
>
> Si haces esto se ve la simetria,
> select(convert_from(decrypt(encrypt(convert_to...... no te fies nunca
> de las conversiones por defecto cuando estas usando bytea, siempre se
> revuelven y te muerden donde menos lo esperas.
>
>
>
> Saludos.
> Francisco Olarte.
>
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
> Para cambiar tu suscripci�n:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripcin:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Esneiker Enriquez Cabrera 2015-11-13 17:24:39 RE: problema con codificacion
Previous Message Francisco Olarte 2015-11-13 17:05:32 Re: problema con codificacion