Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Datos encriptados en MySQL

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Datos encriptados en MySQL Responder citando

Estoy empezando a trabajar con este motor. Tengo una tabla en la que los datos personales, por seguridad, están encriptados con AES_ENCRYPT y tengo este query:
Código:
SELECT num_socio, AES_DECRYPT(apellidos, @clavencrypt) ApeSoc, AES_DECRYPT(nombre, @clavencrypt) NomSoc, login_socio FROM inscripciones

Se ejecuta sin problema y la consulta genera un resultado, pero todas las columnas encriptadas vienen vacías y todas tiene datos seguro.

Me explico mejor. Si yo ejecuto el query directamente en el shell de MySQL me devuelve, por ejemplo, esto:
Cita:
+----------------+--------+--------------+
| ApeSoc | NomSoc | login_socio |
+----------------+--------+--------------+
| MATILLA CAND┴S | ┴NGEL | angelmatilla |
+----------------+--------+--------------+

Como quiero cargar un TListView con los datos recuperados ejecuto eso:
Código:
for (; !Query->Eof; Query->Next())
{
     pItem = Lista->Items->Add();
     pItem->Caption = Query->FieldByName("login_socio")->AsString;
     pItem->SubItems->Add(Trim(Query->FieldByName("ApeSoc")->AsString) + ", " + Query->FieldByName("NomSoc")->AsString);
     pItem->SubItems->Add(Query->FieldByName("num_socio")->AsInteger);
}

y el resultado que obtengo es, por ejemplo, este:

En la columna identidad debería aparecer MATILLA CANDÁS, ÁNGEL. La consulta la ejecuto con un TADOQuery y la base de datos esá conectada con un TADOConnection.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola Angel, el problema que me parece ver por lo que describes, es que los datos no los tienes guardados en la ddbb encriptados, de forma que al intentar desencriptarlos no obtienes ningun valor válido.
En el insert/updates tendrias que haber utilizado AES_ENCRYPT ...
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias por la respuesta juanma. Los datos en la base de datos original sí están encriptados; de hecho, ejecutando el mismo query del ejemplo en el sehll de MySQL sale lo que puse en el comentario; si ejecuto el query sin el decrypt sale esto:
Cita:
Código:
SELECT num_socio, apellidos, nombre, login_socio FROM inscripciones WHERE num_socio = 377;

+-----------+------------------+------------------+--------------+
| num_socio | apellidos | nombre | login_socio |
+-----------+------------------+------------------+--------------+
| 377 | 6[Õ¨^S┐Q▀@ "rÖi | E║■♂Á☼Uµ├bØ►(Õ^k | angelmatilla |
+-----------+------------------+------------------+--------------+

Y el mismo query con el decrypt:
Cita:
Código:
SELECT num_socio, AES_DECRYPT(apellidos, @clave), AES_DECRYPT(nombre, @clave), login_socio FROM inscripciones WHERE num_socio = 377;

+-----------+----------------+--------+--------------+
| num_socio | Apellidos | Nombre | login_socio |
+-----------+----------------+--------+--------------+
| 377 | MATILLA CAND┴S | ┴NGEL | angelmatilla |
+-----------+----------------+--------+--------------+

Por lo tanto, datos sí hay.

No sé si tenga algo que ver con como conecto la base de datos. Estoy usando este código:
    1. Para conectar
    Código:
    void __fastcall TfSocios::FormCreate(TObject *Sender)
    {
         dAsociacion->Close();
         dAsociacion->ConnectionString = "Provider = MSDASQL.1;"
                                         "Persist Security Info = False;"
                                         "Data Source = Asociacion;" //Nombre del origen de datos -- igual al nombre del DSN
                                         "Extended Properties = DATABASE = Asociacion;"
                                         "OPTION = 0;"
                                         "PORT = 3306;" //Puerto
                                         "SERVER = localhost;"
                                         "UID = root;" // Nombre de usuario
                                         "PASSWORD = toledo"; // Password
         try
         {
              dAsociacion->Open();
         }
         catch(...)
         {
         }
    }
    //---------------------------------------------------------------------------

    dAsociacion es un TADOConnection.
    2. En la consulta.
    Código:
    Query->Close();
    Query->SQL->Text = "SELECT num_socio, AES_DECRYPT(apellidos, @clavencrypt) ApeSoc, AES_DECRYPT(nombre, @clavencrypt) NomSoc, login_socio FROM inscripciones WHERE activado = 'A';
    Query->Open();

    Query es un TADOQuery.

Ya os digo que es la primera vez que me enfrento a MySQL y estoy empezando a conocerlo; por ejemplo: La estructura del comando AES_DECRYPT, ¿es correcta esa manera de pasar la clave al servidor?

En Club Delphi he visto un enlace a un código para implementar las funciones de encriptación AES directamente en Cifrar texto con AES-256; parecen muy interesantes y no me importaría usarlas pero el problema que tengo es que desde el formulario C++ aunque haga la SELECT sin la función AES_DECRYPT no devuelve datos.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Ya veo ...
Has probado a introducir la clave directametne en la funcion
Código:
Query->SQL->Add("SELECT num_socio, AES_DECRYPT(apellidos, 'tuclave') ApeSoc, AES_DECRYPT(nombre, 'tuclave') NomSoc, login_socio FROM inscripciones");


Me da la impresion que @clavencrypt lo interpreta bien el shell de mysql pero con los componentes del cbuilder me suena que llevan 2 puntos (:clavencrypt) y asociarles el valor en parameter
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Probaré. No obstante si hago el query sin el decrypt también me devuelve una cadena vacía.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

juanma escribió:
Me da la impresion que @clavencrypt lo interpreta bien el shell de mysql pero con los componentes del cbuilder me suena que llevan 2 puntos (:clavencrypt) y asociarles el valor en parameter

Tenías razón. Me fie del manual de MySQl que comenta que por seguridad la clave se pase con @clave.

Pero se me plantea otro problema, este un poco más genérico. Al cambiar los @clave por :clave el query queda así:
Código:
Query->Close();
Query->SQL->Text = "SELECT num_socio, AES_DECRYPT(apellidos, :clave) ApeSoc, AES_DECRYPT(nombre, :clave) NomSoc, login_socio FROM inscripciones ORDER BY ApeSoc, NomSoc, num_socio";
Query->Parameters->ParamByName("clave")->Value = clavencrypt;
Query->Open();

Ese ParamByName, ¿no debería reemplazar todos los :clave por su valor? Lo digo porque puesto tal cual sólo me sustituye el primero que encuentra.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.