Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-09-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Sobre el uso de la función HASH

Buenas. Estoy trabajando con una base de datos hecha en FB 2.5. Hurgando por esos mundos de Dios he venido a dar con la función HASH(); sinceramente desconocía que estuviera implementada en el motor y me ha parecido muy interesante.

Dado que la base de datos a la que me refiero usa varios campos con información sensible (datos personales o números de cuentas bancarias) me pareció interesante desde el principio la posiblidad de encriptar o cifrar de alguna forma esta información de manera que si la base de datos es "asaltada" por cualquiera la información no sea facilmente accesible.

Sobre como guardar la información no tengo problema; he comprendido desde el principio como hacerlo:
Código SQL [-]
INSERT INTO Tabla (Nombre, Apellidos) VALUES (HASH(:Nombre), HASH(:Apellidos))
Sin embargo no entiendo como podría recuperar la información. Por ejemplo: Tengo guardada en una tabla un campo Nombre que contiene (sin cifrar ni nada) el valor ÁNGEL. Si hago un HASH sobre esa celda me devuelve el valor 12987292. Ahora bien, ¿cómo hago para que al hacer un SELECT sobre esa celda se recupere el valor original ÁNGEL? He esatdo mirando por aquí y en otras webs y no veo como poder hacerlo.
Responder Con Cita
  #2  
Antiguo 05-09-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Hash no devuelve un cadena cifrada/encriptada, sino un valor que sirve para comprobar que la cadena no ha sido modificada.
Ejemplo, imagina un campo blob donde se ha guardado una imagen:
hash("campoimagen") devuelve, ejemplo: 42342342
Alguien edita la imagen y la guarda, se puede comprobar su hash:
hash("campoimagen") devuelve, ejemplo: 4432u42222 Es distinto, quiere decir que la imagen ha sido editada.
Responder Con Cita
  #3  
Antiguo 05-09-2017
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Hash NO ES SUBSTITUTO DE UN ALGORITMO DE ENCRIPTACION.

----

Es increíble el inmenso daño que tutoriales de "seguridad" le han hecho a la comunidad!!!

---

Que es un hash?

https://en.wikipedia.org/wiki/Hash_function

Cita:
A hash function is any function that can be used to map data of arbitrary size to data of fixed size.
....

One use is a data structure called a hash table, widely used in computer software for rapid data lookup.

.....

They are also useful in cryptography. (Nota que son utiles en criptografia, pero NO ES LO QUE DEBES USAR PARA LOS PASWORDS, sigue leyendo...)

A cryptographic hash function allows one to easily verify that some input data maps to a given hash value, but if the input data is unknown, it is deliberately difficult to reconstruct it (or equivalent alternatives) by knowing the stored hash value. This is used for assuring integrity of transmitted data

....

Hash functions are related to (and often confused with) checksums, check digits, fingerprints, lossy compression, randomization functions, error-correcting codes, and ciphers. <----- ESTO ES LO QUE BUSCAS!
Nota que hay varios tipos y usos de hashes.

Hash *precisamente* esta diseñado para *evitar* "recuperar la información". Osea, no son "reversibles". Eso derrota su proposito.

Si vas a encriptar, debes usar un algoritmo de *encriptacion*. Nota como "hash" no es parecido ni a palos a "encrypt". Hashing puede ser parte de los *pasos* en la encriptacion.

Un cipher, por el contrario:

https://en.wikipedia.org/wiki/Cipher
Cita:
In cryptography, a cipher (or cypher) is an algorithm for performing encryption or decryption—a series of well-defined steps that can be followed as a procedure.
Ves, esto si es lo que quieres!

Pero CUAL algoritmo de encriptacion?

Mas importante aun, usa una libreria ya hecha y probada, no lo "inventes".

https://paragonie.com/blog/2016/02/h...ssword-in-2016
Cita:
We've previously said that even security advice should carry an expiration date.
Nota que que es lo "mejor" va cambiando con los tiempos.

LibSodium es considerado una de las mejores librerias y esta disponible para Delphi!

https://download.libsodium.org/doc/b...ges/index.html
__________________
El malabarista.
Responder Con Cita
  #4  
Antiguo 06-09-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Muchas gracias a los dos. Efectivamente la confusión se debe a un error de concepto. Amplío mi pregunta: ¿Existe una función similar en FB al crypt/decrypt de MySQL?
Responder Con Cita
  #5  
Antiguo 06-09-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que la versión 3 sí trae, para versiones anteriores, mira esto.
Responder Con Cita
  #6  
Antiguo 06-09-2017
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Lo que leo de ese articulo es acerca de encriptar la BD (completa) o su metadata, no los datos especificos de la aplicacion.

Con todo, no necesitas nada especial como soporte en la BD. Manda directo la cadena encriptada desde tu app, idealmente con un prefijo que exprese que algo+salt+value usaste, como:

Cita:
pbkdf2_sha256$30000$dFgV....$Q/hJH6fO5VdFqeE4....
(asi se hace en django)
__________________
El malabarista.
Responder Con Cita
  #7  
Antiguo 07-09-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Creo que la versión 3 sí trae, para versiones anteriores, mira esto.
No, no lo trae. Y en ese sentido Firebird es categórico:
Cita:
Why doesn't Firebird provide encryption?
Y dan una serie de alegaciones que me aprecen un tanto incosistentes:
Cita:
Encryption can only be as good as the secret key required for decryption. It can be worse but it cannot be better. There are several excellent encryption algorithms available that could be used. When good encryption is used, attacks are likely to be against the key rather than against the encryption itself.
¡Claro que el cifrado es tan bueno como la clave empleada para ello! Pero ese es un problema del usuario, en este caso del programador, y no del motor de la base de datos. No obstante ahora recuerdo que en su momento desarrollé un sistema de encriptación para Clipper y lo subí, adaptado, a otro foro. Lo buscaré.
Cita:
Empezado por mamcx Ver Mensaje
Con todo, no necesitas nada especial como soporte en la BD. Manda directo la cadena encriptada desde tu app, idealmente con un prefijo que exprese que algo+salt+value usaste

Última edición por Angel.Matilla fecha: 07-09-2017 a las 11:03:41.
Responder Con Cita
  #8  
Antiguo 07-09-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Mira esto: http://delphi.jmrds.com/node/95
Responder Con Cita
  #9  
Antiguo 07-09-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Interesante código. Lo estudiaré con calma.
Responder Con Cita
  #10  
Antiguo 07-09-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Otro ejemplito:

Código Delphi [-]
// Estas dos "units" las puedes encontrar en el adjunto que he puesto
uses AES, Base64;
 
function Cifrar(Str,Clave: String): String;
var
  Src: TStringStream;
  Dst: TMemoryStream;
  Size: Integer;
  Key: TAESKey;
  ExpandedKey: TAESExpandedKey;
begin
  Result:= EmptyStr;
  Src:= TStringStream.Create(Str);
  try
    Dst:= TMemoryStream.Create;
    try
      // Preparamos la clave, lo ideal es que tenga 32 caracteres
      FillChar(Key,Sizeof(Key),#0);
      if Length(Clave) > Sizeof(Key) then
        move(PChar(Clave)^,Key,Sizeof(key))
      else
        move(PChar(Clave)^,Key,Length(Clave));
      AEsExpandKey(ExpandedKey,Key);
      // Guardamos el tamaño del texto original
      Size:= Src.Size;
      Dst.WriteBuffer(Size,Sizeof(Size));
      // Ciframos el texto
      AESEncryptStreamECB(Src,Dst,ExpandedKey);
      // Lo codificamos a base64
      Result:= BinToStr(Dst.Memory,Dst.Size);
    finally
      Dst.Free;
    end;
  finally
    Src.Free;
  end;
end;



function Descifrar(Str,Clave: String): String;
var
  Src: TMemoryStream;
  Dst: TStringStream;
  Size: Integer;
  Key: TAESKey;
  ExpandedKey: TAESExpandedKey;
begin
  Result:= EmptyStr;
  Src:= TMemoryStream.Create;
  try
    Dst:= TStringStream.Create(Str);
    try
      StrToStream(Str,Src);
      Src.Position:= 0;
      FillChar(Key,Sizeof(Key),#0);
      if Length(Clave) > Sizeof(Key) then
        move(PChar(Clave)^,Key,Sizeof(key))
      else
        move(PChar(Clave)^,Key,Length(Clave));
      AESExpandKey(ExpandedKey,Key);
      // Leemos el tamaño del texto
      Src.ReadBuffer(Size,Sizeof(Size));
      AESDecryptStreamECB(Src,Dst,ExpandedKey);
      Dst.Size:= Size;
      Result:= Dst.DataString;
    finally
      Dst.Free;
    end;
  finally
    Src.Free;
  end;
end;

Para terminar, un pequeño ejemplo de cómo funciona:

* Ciframos el texto "Hola mundo": Str := Cifrar("Hola mundo",'1234567890');
* Ahora la variable Str contiene el texto: CgAAADpn2TqC3VGqJmIQdPzgAaA=
* Desciframos el texto anterior: Str := Descifrar("CgAAADpn2TqC3VGqJmIQdPzgAaA=",'1234567890');
* Ahora la variable Str vuelve a contener el texto: "Hola mundo"

--------------------------------------------------
Otro más: http://delphi.jmrds.com/node/96


Como ves, el amigo Seoane tiene bastantes recursos sobre el tema.
Archivos Adjuntos
Tipo de Archivo: zip cript.zip (11,3 KB, 21 visitas)
Responder Con Cita
  #11  
Antiguo 07-09-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Ya encontré el código que comentaba antes. Es un pelín "pedestre" pero funciona y la misma función vale en ambos sentidos: para cifrar y descifrar. Este es el código que quedó al final, después de varios repasos de gente del foro.
Código PHP:
AnsiString Encriptar(AnsiString Texto)
{
     
AnsiString Salida "";
     
unsigned char Clave[] = "891475632";
     
unsigned char *cTexto Texto.c_str();

     for (
int i 00strlen(cTexto); ++, ++)
     {
          if (
strlen(Clave))
                
0;

          
Salida += char(cTexto[i] ^ (Clave[y] - 48));
     }
     return 
Salida;

Con esa clave, que puede ser tan larga como se quiera, que está puesta tendríamos:
- Si pasamos ANGELITO devuelve IGFAKLRL.
- Y si pasamos IGFAKLRL devuelve ANGELITO.

Por supuesto que está abierto a mejoras en cualquier sentido.
Responder Con Cita
  #12  
Antiguo 07-09-2017
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
No!

Ese tipo de "cifrado" a duras penas es eficiente en contra de un infante que aun no sabe leer!

Usa un algoritmo *probado*. De lo contrario, ni pierdas el tiempo.
__________________
El malabarista.
Responder Con Cita
  #13  
Antiguo 07-09-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Hay varias bibliotecas para Delphi dando vueltas por ahi. Yo no uso ninguna en produccion, asi que mas que un sabio consejo es una directriz para que investigues por tu cuenta

El framework Spring4D tiene clases para cifrado. Yo utilizo este framework ampliamente, no la parte de cifrados, pero te puedo asegurar que es de calidad "top" en el mundo de Delphi.

Puedes revisar las unidades de cifrado que estan en Source / Extensions / Cryptography

Podes tomar los test de unidad como ejemplos de uso

Hay otras bibliotecas tambien como LockBox, LockBox3, y TForge, esta tambien cuenta con un blog del autor que podes consultar
Responder Con Cita
  #14  
Antiguo 08-09-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Gracias por vuestars respuestas.

Sobre lo que comenta mamcx acerca de la facilidad para romper la cifra. Tienes razón, y no deja de ser un prototipo mejorable.
AgustinOrtu: Es cierto que hay multitud de librerias y paquetes tanto para Delphi como Builder sobre este tema pero quiero evitar en lo posible emplear paquetes ajenos a Borland. Me han dado demasiados problemas y estoy bastante escaldado.

Seguiré buscando alternativas por código sin necesidad de paquetes externos.
Responder Con Cita
  #15  
Antiguo 08-09-2017
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Angel.Matilla Ver Mensaje
Sobre lo que comenta mamcx acerca de la facilidad para romper la cifra. Tienes razón, y no deja de ser un prototipo mejorable.
No mejorable. INUTIL, MALO. Este es uno de los casos donde sin DUDAR hay que usar codigo probado y hecho por EXPERTOS.

SIN EXCEPCIONES!

Y que hay de tener una dependencia minima? Si hasta casimiro te paso las units. Ni que estuvieras con una inmensa libreria.


---

Se que suena a regaño pero este es un tema que *nosotros* los programadores nos la pasamos olimpicamente por la galleta. La falta de seguridad y privacidad es el fracaso mas grande de la industria de IT, y si no nos importa a nosotros, pues a quien?
__________________
El malabarista.
Responder Con Cita
  #16  
Antiguo 08-09-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Si el código aportado por Ángel.Matilla va a ser usado en algún lugar que no les afecte el que puedan descifrar los datos, entonces no hay problema.
Pero, desde luego, ese código es el típico primer ejemplo que viene en cualquier tutorial para empezar a enseñar cómo se usa una función de cifrado. Cualquier aficionado puede descifrarlo con un mínimo de esfuerzo.
Responder Con Cita
  #17  
Antiguo 09-09-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
No mejorable. INUTIL, MALO. Este es uno de los casos donde sin DUDAR hay que usar codigo probado y hecho por EXPERTOS.

SIN EXCEPCIONES!

Y que hay de tener una dependencia minima? Si hasta casimiro te paso las units. Ni que estuvieras con una inmensa libreria.


---

Se que suena a regaño pero este es un tema que *nosotros* los programadores nos la pasamos olimpicamente por la galleta. La falta de seguridad y privacidad es el fracaso mas grande de la industria de IT, y si no nos importa a nosotros, pues a quien?
Mira te doy la razón en todos y cada uno de los puntos que dices, del primero al último. Y sí, es verdad que el código de Casimiro tiene muy buena pinta y efectivamente no haría falta instalar ninguna librería externa. Llevo un par de días viéndolo y estudiándolo, igual que sigo buscando por la red soluciones. No cejo en mi empeño. En lo de las librerías no me refería, evidentemente, al código que subió Casimiro.
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Si el código aportado por Ángel.Matilla va a ser usado en algún lugar que no les afecte el que puedan descifrar los datos, entonces no hay problema.
Pero, desde luego, ese código es el típico primer ejemplo que viene en cualquier tutorial para empezar a enseñar cómo se usa una función de cifrado. Cualquier aficionado puede descifrarlo con un mínimo de esfuerzo.
A ver: Son bases de datos que aunque están instaladas en red están aisladas, pero todos sabemos que en el momento que hay un acceso a internet hay una puerta abierta a cualquier entrada no permitida en los sistemas. Son cosas que, además, tengo que hacer sin que los usuarios se enteren para que no me obliguen a no ponerlo. ¿Sabéis la guerra que he tenido para que simplemente hubiera usuarios registrados y que la clave no fuera indefinida? Me ha costado sudor convencerles de instaurar ese mínimo de seguridad.
Responder Con Cita
  #18  
Antiguo 09-09-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pues con más razón, no puedes usar tu códgo, imagina que se llevan una copia de la base de datos (no hace falta internet), ¿cuáles serían los comentarios y reproches? "Mira, tanta seguridad y al final se llevan la BD y seguro que la han descifrado".

Que no lleguen a eso
Responder Con Cita
  #19  
Antiguo 09-09-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Responder Con Cita
  #20  
Antiguo 18-12-2018
rrf rrf is offline
Miembro
 
Registrado: ago 2003
Ubicación: S/C Tenerife, España
Posts: 454
Poder: 21
rrf Va por buen camino
Estimado Casimiro:

Muchas gracias por el código y los Units que incluyes en el comentario #10 de este hilo. Se ajusta perfectamente a lo que estaba buscando para codificar texto: sencillez y efectividad.

Y, además de darte las gracias, te pregunto si ese código es de libre uso, si tiene autor y/o cuales son las condiciones para usarlo en un programa que podría llegar a distribuirse gratuita o comercialmente.

Saludos.

Última edición por rrf fecha: 18-12-2018 a las 23:34:55. Razón: corregir la redacción
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Tablas Hash godel Lazarus, FreePascal, Kylix, etc. 3 19-02-2008 12:40:03
codigo hash maco2007 Varios 4 20-10-2007 18:01:04
Calcular hash md5 Lepe Trucos 1 10-05-2007 16:11:58
Hash RaulChemical Varios 1 07-09-2004 21:10:11
¿Hash or not Hash? hgiacobone Varios 5 17-07-2003 20:43:26


La franja horaria es GMT +2. Ahora son las 11:21: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
Copyright 1996-2007 Club Delphi