Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Constraint Unique con Columna encriptada (https://www.clubdelphi.com/foros/showthread.php?t=93964)

juniorSoft 28-05-2019 00:25:49

Constraint Unique con Columna encriptada
 
Hola Amigos,


Tengo una tabla con una columna que almacena los datos encriptados utilizando la funcion ENCRYPTBYPASSPHRASE de sql server 2014, el inconveniente que tengo es que a esa columna le aplique una restricción unique para que no se repita el dato, pero no funciona ya que si introduzco varios registros con una cadena 'Juan' ejemplo convert(varchar(800), ENCRYPTBYPASSPHRASE('1111', 'Juan')) varias veces lo permite, la columna esta declarada como varchar(800) .

Saludos Cordiales,

Casimiro Notevi 28-05-2019 02:24:16

Se supone que entonces guardas la cadena "Juan" de forma cifrada, y cada vez es distinta, por lo que ese campo no puede ser "único".

juniorSoft 28-05-2019 02:45:10

Cita:

Se supone que entonces guardas la cadena "Juan" de forma cifrada, y cada vez es distinta, por lo que ese campo no puede ser "único".
Entonces el valor que devuelve ENCRYPTBYPASSPHRASE que es de tipo Varbinary convertido a cadena generado por convert(varchar(800), ENCRYPTBYPASSPHRASE('1111', 'Juan')) es diferente de convert(varchar(800), ENCRYPTBYPASSPHRASE('1111', 'Juan'))

Tendré que buscar otra alternativa para validar que no se repitan. entendía que devolverían el mismo valor, debo hacer algo que sin mostrar la info impida duplicados.

Gracias por la repuesta,

Casimiro Notevi 28-05-2019 10:26:59

Es que entonces será fácil de descifrar. Por ejemplo, usando code64 o algún otro método reversible.
De todas formas, ignoro cómo trabaja ENCRYPTBYPASSPHRASE.

juniorSoft 28-05-2019 14:54:28

Cita:

Es que entonces será fácil de descifrar. Por ejemplo, usando code64 o algún otro método reversible.
De todas formas, ignoro cómo trabaja ENCRYPTBYPASSPHRASE.

Lo que sucede es que si una tabla tiene cientos, miles o millones de registros es cuesta arriba descifrarlos todos para comparar si se repiten. Para descifrarlo se utiliza otra función de sql server DECRYPTBYPASSPHRASE pero habría que aplicarlo a todos los registros, podría ser en un trigger
pero sospecho que podría ralentizar el proceso y también tendría otro inconveniente habría que seder la clave para descifrar al trigger, podría validarlo en el cliente pero no me gusta la idea por si se requiere hacer otros módulos, aunque es una opción ya que en esta tabla no tiene millones de registros.

juniorSoft 28-05-2019 15:35:30

Al parecer es un viejo tema de sql server Enforcing a unique constraint

Casimiro Notevi 28-05-2019 17:56:53

De todas formas, hay personas que se llaman igual, no puede ser un campo "único".

juniorSoft 28-05-2019 18:17:52

Cita:

De todas formas, hay personas que se llaman igual, no puede ser un campo "único".
a menos que sea una tabla de usuarios y el campo sea el nick de usuario que se desea que sea único. De todas formas la solución más fácil será verificar con un select, desencriptando el campo y comparando con el que se introducirá.

Casimiro Notevi 28-05-2019 18:44:22

No conocemos los requisitos que se exigen para ese dato. Si te sirve eso, pues adelante.

juniorSoft 28-05-2019 18:59:55

^\||/^\||/


La franja horaria es GMT +2. Ahora son las 22:08:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi