Usuario y Contraseña - Encriptar y Desencriptar


21 de Octubre del 2020

Buenas tardes, espero que se encuentren muy bien!!

Estoy programando un login desde una aplicación en delphi que se conecta a una base de datos PostGreSQL, en la cual, encripto la columna que guarda la contraseña de login, el programa corre bien, y y si hago la consulta por ejemplo a un grid o a edit normal, el dato sale desencriptado, sin embargo, desde login no encuentra la informació. El código es el siguiente:

Adoquery1.Close();
Adoquery1.SQL.Clear();

Adoquery1.SQL.Add('SELECT "ID_USER", "USUARIO", pgp_sym_decrypt("CLAVE"::bytea,''AES_KEY'') as "CLAVE", "COD_EMPLEADO" FROM "schema_SYS00"."USERS"');
Adoquery1.SQL.Add('WHERE "USUARIO" =' + '''' + dbedit1.Text + '''');
Adoquery1.SQL.Add('AND pgp_sym_decrypt("CLAVE"::bytea,''AES_KEY'') =' +''''+ dbedit2.text+'''');
Adoquery1.Open;

if adoquery1.RecordCount = 0 then
showmessage("El usuario o contraseña están incorrecto') else
form1.showmodal;

 

Siempre me manda el mensaje y no carga el formulario.

Muchas gracias...

Rolando.


David Carrero
12 de Agosto del 2026

Hola,

El síntoma (funciona bien, pero al mostrarlo después de leerlo de la base de datos sale distinto) casi siempre viene de uno de estos dos motivos, ambos relacionados con cómo PostgreSQL guarda el texto, no con tu lógica de encriptación:

1. La columna es CHAR(n) en vez de VARCHAR(n). CHAR es de ancho fijo: si tu valor encriptado ocupa menos que el ancho de la columna, PostgreSQL lo rellena con espacios hasta completar ese ancho. Al leerlo de vuelta, esos espacios extra al final rompen la comparación/desencriptación aunque a simple vista en un grid no se noten. Comprueba el tipo real de la columna:

SELECT column_name, data_type, character_maximum_length
FROM information_schema.columns
WHERE table_name = 'tu_tabla' AND column_name = 'password';

Si sale character en vez de character varying, ahí tienes el problema. La solución es cambiar la columna a VARCHAR, o mientras tanto hacer Trim() al valor justo después de leerlo de la base de datos, antes de desencriptarlo o compararlo.

2. Codificación de caracteres distinta entre la conexión Delphi y la base de datos. Si tu función de encriptación trabaja con bytes crudos y la conexión a PostgreSQL está convirtiendo la codificación (por ejemplo, de Latin1 a UTF-8) al guardar o leer, algunos bytes del valor encriptado pueden alterarse en el proceso, ya que no todo byte binario es una secuencia UTF-8 válida.

Para descartar cuál de los dos es tu caso, la prueba más rápida: imprime la longitud en bytes del valor justo antes de guardarlo, y la longitud del valor justo después de leerlo de vuelta. Si no coinciden exactamente, ya sabes que el problema está en el camino de ida y vuelta a la base de datos, no en tu lógica de encriptación.

David Carrero