Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   Bases de datos (https://www.cobolforo.es/forumdisplay.php?f=27)
-   -   [MySQL] Funciones de encriptación MySql (https://www.cobolforo.es/showthread.php?t=148)

Josber 3 de junio de 2015 12:21

Funciones de encriptación MySql
 
¿ Alguien ha utilizado éstas funciones ?.

He estado haciendo pruebas y la encriptación bien, pero la desencriptación siempre me devuelve NULL

por ejemplo:

Código SQL:
  1. SELECT aes_encrypt('hola mundo','hola')

me devuelve "7ebc5af2638fab23d0828131db36c6c1"

pero al desencriptar, me devuelve "NULL"

He probado con varias funciones de encriptación y siempre es igual.

Muchas gracias
Un saludo.-

Kuk 3 de junio de 2015 17:30

Josber, que yo sepa, los valores encriptados nunca se desencriptan. Lo que se suele hacer, es tambien encriptar el valor nuevo y comprarlos. Es decir, un tío se da de alta como usuario, su contraseña se encripta y se guarda en la tabla. Cada vez que el tío accede a su cuenta, NO se desencripta su contraseña nunca. Se encripta la que viene de introducir y se compara con la guardada (ya encriptada).

Este es (que yo sepa) el modus operandi de las encriptaciones en MySQL. ;)

Josber 3 de junio de 2015 19:11

Necesito desencriptarlos Kuk, es una tabla que guarda datos "sensibles", que han de ser encriptados, para más tarde, desencriptarlos y mostrarlos en un listview. Que siempre puede llegar un "listillo", abrir la tabla con un gestor de SQL, como el XAMP/WAMP, y ver los datos, o lo que es peor modifcarlos

Un saludo.-

Añadido despues de 13 minutos
Mira, te pongo las dos maneras que he usado:

En ésta me devuelve un valor NULL en LPPRO1...LPPRO5

Código COBOL:
  1.      EXEC SQL
  2.           DECLARE cursor_tabla CURSOR FOR
  3.                   SELECT LPNUM,
  4.                         AES_DECRYPT(LPPRO1,'FaCtUrAcIóN'),
  5.                         AES_DECRYPT(LPPRO2,'FaCtUrAcIóN'),
  6.                         AES_DECRYPT(LPPRO3,'FaCtUrAcIóN'),
  7.                         AES_DECRYPT(LPPRO4,'FaCtUrAcIóN'),
  8.                         AES_DECRYPT(LPPRO5,'FaCtUrAcIóN'),
  9.                         AES_DECRYPT(LPPRO6,'FaCtUrAcIóN')
  10.                         FROM LPRO
  11.      END-EXEC.
  12.             .
  13.             .
  14.             .
  15.      EXEC SQL
  16.           FETCH cursor_tabla
  17.                INTO :LPNUM,
  18.                        :LPPRO1,
  19.                        :LPPRO2,
  20.                        :LPPRO3,
  21.                        :LPPRO4,
  22.                        :LPPRO5,
  23.                        :LPPRO6

Y ésta otra, me dice que faltan las variables depués del INTO

Código COBOL:
  1.      EXEC SQL
  2.           DECLARE cursor_tabla CURSOR FOR
  3.                   SELECT LPNUM,
  4.                          LPPRO1,
  5.                          LPPRO2,
  6.                          LPPRO3,
  7.                          LPPRO4,
  8.                          LPPRO5,
  9.                          LPPRO6
  10.                   FROM LPRO
  11.      END-EXEC.
  12.             .
  13.             .
  14.             .
  15.      EXEC SQL
  16.           FETCH cursor_tabla
  17.                 INTO  :LPNUM
  18.                          AES_DECRYPT(:LPPRO1,'FaCtUrAcIóN'),
  19.                          AES_DECRYPT(:LPPRO2,'FaCtUrAcIóN'),
  20.                          AES_DECRYPT(:LPPRO3,'FaCtUrAcIóN'),
  21.                          AES_DECRYPT(:LPPRO4,'FaCtUrAcIóN'),
  22.                          AES_DECRYPT(:LPPRO5,'FaCtUrAcIóN'),
  23.                          AES_DECRYPT(:LPPRO6,'FaCtUrAcIóN')
  24.      END-EXEC.


Un saludo.-

Kuk 3 de junio de 2015 19:56

Josber, en el segundo te falta una coma:

Código SQL:
  1. EXEC SQL
  2.           FETCH cursor_tabla
  3.                 INTO  :LPNUM    /* <== AQUI!!! */
  4.                          AES_DECRYPT(:LPPRO1,'FaCtUrAcIóN'),
  5.                          AES_DECRYPT(:LPPRO2,'FaCtUrAcIóN'),
  6.                          AES_DECRYPT(:LPPRO3,'FaCtUrAcIóN'),
  7.                          AES_DECRYPT(:LPPRO4,'FaCtUrAcIóN'),
  8.                          AES_DECRYPT(:LPPRO5,'FaCtUrAcIóN'),
  9.                          AES_DECRYPT(:LPPRO6,'FaCtUrAcIóN')
  10.      END-EXEC.

En cuanto a lo de NULL, haces todo bien. El problema es (según he leído), la longitud de los campos encriptados. Es decir, si usas VarChar, debes saber la longitud exacta e indicarsela a la hora de decriptar. Si algo no le cuadra, devuelve NULL:

Cita:

The answer is that the columns are binary when they should be varbinary. This article explains it:

Because if AES_DECRYPT() detects invalid data or incorrect padding, it will return NULL.

With binary column types being fixed length, the length of the input value must be known to ensure correct padding. For unknown length values, use varbinary to avoid issues with incorrect padding resulting from differing value lengths.
Para indicar la longitud, graba todo con la misma longitud y haz SELECT indicando esa misma longitud. Cómo se declaraban los VarChar en COBOL creo que te lo comenté. Si no te acuerdas, te lo pongo otra vez.
Si no tienes datos muy largos, usa Char ;)

Josber 3 de junio de 2015 20:13

Pues mañana probaré Kuk, lo de la coma, es que al pasarlo me la he comido, pero está puesta.
Y sí, creo que lo tengo, es lo del LEVEL 49, ¿no?

Un saludo

Kuk 3 de junio de 2015 22:58

Cita:

Citación del post de Josber (Mensaje 654)
es lo del LEVEL 49, ¿no?

Eso es! Ya me contarás qué tal ;)

Código COBOL:
  1.  01  MI-VARCHAR.
  2.      49  MI-VARCHAR-L   PIC S9(9) COMP-4.
  3.      49  MI-VARCHAR-D   PIC X(nn).

Josber 4 de junio de 2015 13:12

Nada no hay manera, ahora con esa definición de las variables, cuando el programa "entra" en la sentencia SQL de grabar, se queda en el limbo y no hace nada ...

Un saludo

Kuk 4 de junio de 2015 14:43

Josber, puede que haya problemas con los VarChar, intenta con los Char de longitud fija y a ver qué tal. Es decir, definir los campos como Char en lugar de VarChar, definir variables de la misma longitud e intentar así.

También te digo que yo lo que hice un día fue encriptarlos por programa, me hice 2 rutinas correspondientes a encriptado y decriptado, directmanete en COBOL, en el própio módulo. Escribía en un fichero, y abriendolo en UltraEdit, solo se veía cilandro en vez de texto :D Decriptar eso no hay manera como tal, ahí hay que decompilar el programa y ver qué es lo que hace, cosa que ya hablamos de hackers Senior Executive :D Profesionales de semejante calibre no se van a molestar con programas como el tuyo o el mío ;)

Juanghi 12 de julio de 2015 02:06

Al encriptar una clave por ejemplo, le adjuntas una palabra que te pueda descencriptar
eje tipico .. una tabla de usuarios

Código SQL:
  1. INSERT INTO usuarios
  2.              (cod_usu, cla_usu, nom_usu)
  3.              VALUES ('codigousu', AES_ENCRYPT('clave', 'secreta'), 'nombre usuario')

.. donde secretar es la palaba que usuaras para saber la clave
.. luego en
Código SQL:
  1. SELECT
  2.      cod_usu, AES_DECRYPT(cla_usu, 'secreta') AS cla_usu, nom_usu
  3.      cod_usu, cla_usu, nom_usu
  4.      FROM   usuarios WHERE cod_usu = 'codigousu'

te rescatara el registro con la clave abierta .. en este caso = a 'clave'


La franja horaria es GMT +2. Ahora son las 13:03.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.