Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-09-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
¿Como funciona MD5?

Hola, estoy pensando en implementar mi aplicacion con la comprobacion de archivo corrupto usando MD5. ¿Pero como funciona esto?
Ojo, no pido que me digais como hacerlo, sino que me orienteis si es posible claro. Por ejemplo:

¿Que pasos se darian a partir de pasarle a esa funcion un archivo "x"? generaria alguna cadena alfanumerica que contenga la informacion de ese archivo y luego que? con que se compara para saber si el archivo esta o no corrupto?

Perdonad pero nunca he usado esto y estoy super perdido y lo que encuentro en google gira en torno a la encriptacion de datos pero yo pretendo otra cosa ¿no?

Saludos y gracias.
Responder Con Cita
  #2  
Antiguo 30-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
danielmj,

Cita:
...implementar mi aplicación con la comprobación de archivo corrupto usando MD5. ¿Pero como funciona esto?...
Revisa estos links:
Cita:
MD5 : http://es.wikipedia.org/wiki/MD5

Calculate MD5 Checksum for a File or String from Delphi : http://delphi.about.com/b/2011/03/04...rom-delphi.htm

File MD5 checksum : http://stackoverflow.com/questions/4...e-md5-checksum

Delphi – MD5: the MessageDigest_5 unit has been there since Delphi 2007 : http://wiert.me/2009/12/11/delphi-md...e-delphi-2007/

Hash-Alogrithm: MD4, MD5, RipeMD160, SHA1, Haval (128-256) : http://delphi.icm.edu.pl/ftp/d20free/cipher.zip
Espero sea útil

Nelson.
Responder Con Cita
  #3  
Antiguo 30-09-2013
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
A grandes razgos, consigues una unidad que calcule el MD5, las que eh visto, manejan archivos, solo le pasas la ubicacion y te regresan el MD5, despues lo conviertes a hexadecimal, generalmente la unidad tambien trae la conversion, y listo! ya tienes ese hash, para checarlo, pues sacas otro hash y que sean iguales...
Responder Con Cita
  #4  
Antiguo 30-09-2013
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
No la ubicacion del archivo. El archivo completo.
__________________
El malabarista.
Responder Con Cita
  #5  
Antiguo 30-09-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
gracias luisgutierrezb, estoy ahora mismo leyendo y mirando informacion sobre esto. En cuanto a tu respuesta, me ha servido para tener una idea mas general pero concreta. Espero aclararme.

Saludos.
Responder Con Cita
  #6  
Antiguo 30-09-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Hola mancx, imagino que te refieres a la ruta completa+nombre de archivo, al menos eso es lo que yo suponia, de otra forma aun sabiendo la ubicacion del archivo, no tendrá el nombre de este. Bueno, veremos a ver como se me da esto del hash!

saludos y gracias.
Responder Con Cita
  #7  
Antiguo 30-09-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Buenas, encontré esta unidad en la pagina de seoane:

Código Delphi [-]


unit Hashes;

interface

uses Windows, SysUtils, Classes;

type
  THashAlgorithm = (haMD5, haSHA1);

function CalcHash(Stream: TStream; Algorithm: THashAlgorithm): string; overload;
function CalcHash(Archivo: string; Algorithm: THashAlgorithm): string; overload;
function CalcHash2(Str: string; Algorithm: THashAlgorithm): string;

implementation

type
  HCRYPTPROV = ULONG;
  PHCRYPTPROV = ^HCRYPTPROV;
  HCRYPTKEY = ULONG;
  PHCRYPTKEY = ^HCRYPTKEY;
  HCRYPTHASH = ULONG;
  PHCRYPTHASH = ^HCRYPTHASH;
  LPAWSTR = PAnsiChar;
  ALG_ID = ULONG;

const
  CRYPT_NEWKEYSET = $00000008;
  PROV_RSA_FULL = 1;
  CALG_MD5 = $00008003;
  CALG_SHA1  = $00008004;
  HP_HASHVAL = $0002;

function CryptAcquireContext(phProv: PHCRYPTPROV;
  pszContainer: LPAWSTR;
  pszProvider: LPAWSTR;
  dwProvType: DWORD;
  dwFlags: DWORD): BOOL; stdcall;
  external ADVAPI32 name 'CryptAcquireContextA';

function CryptCreateHash(hProv: HCRYPTPROV;
  Algid: ALG_ID;
  hKey: HCRYPTKEY;
  dwFlags: DWORD;
  phHash: PHCRYPTHASH): BOOL; stdcall;
  external ADVAPI32 name 'CryptCreateHash';

function CryptHashData(hHash: HCRYPTHASH;
  const pbData: PBYTE;
  dwDataLen: DWORD;
  dwFlags: DWORD): BOOL; stdcall;
  external ADVAPI32 name 'CryptHashData';

function CryptGetHashParam(hHash: HCRYPTHASH;
  dwParam: DWORD;
  pbData: PBYTE;
  pdwDataLen: PDWORD;
  dwFlags: DWORD): BOOL; stdcall;
  external ADVAPI32 name 'CryptGetHashParam';

function CryptDestroyHash(hHash: HCRYPTHASH): BOOL; stdcall;
  external ADVAPI32 name 'CryptDestroyHash';

function CryptReleaseContext(hProv: HCRYPTPROV; dwFlags: DWORD): BOOL; stdcall;
  external ADVAPI32 name 'CryptReleaseContext';

function CalcHash(Stream: TStream; Algorithm: THashAlgorithm): string; overload;
var
  hProv: HCRYPTPROV;
  hHash: HCRYPTHASH;
  Buffer: PByte;
  BytesRead: DWORD;
  Algid: ALG_ID;
  Data: array[1..20] of Byte;
  DataLen: DWORD;
  Success: BOOL;
  i: integer;
begin
  Result:= EmptyStr;
  Success := CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL, 0);
  if (not Success) then
    if GetLastError() = DWORD(NTE_BAD_KEYSET) then
      Success := CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL,
        CRYPT_NEWKEYSET);
  if Success then
  begin
    if Algorithm = haMD5 then
    begin
      Algid:= CALG_MD5;
      Datalen:= 16
    end else
    begin
      Algid:= CALG_SHA1;
      Datalen:= 20;
    end;
    if CryptCreateHash(hProv, Algid, 0, 0, @hHash) then
    begin
      GetMem(Buffer,10*1024);
      try
        while  TRUE do
        begin
          BytesRead:= Stream.Read(Buffer^, 10*1024);
          if (BytesRead = 0) then
          begin
            if (CryptGetHashParam(hHash, HP_HASHVAL, @Data, @DataLen, 0)) then
              for i := 1 to DataLen do
                Result := Result + LowerCase(IntToHex(Integer(Data[i]), 2));
            break;
          end;
          if (not CryptHashData(hHash, Buffer, BytesRead, 0)) then
            break;
        end;
      finally
        FreeMem(Buffer);
      end;
      CryptDestroyHash(hHash);
    end;
    CryptReleaseContext(hProv, 0);
  end;
end;

function CalcHash(Archivo: string; Algorithm: THashAlgorithm): string; overload;
var
  Stream: TFileStream;
begin
  Result:= EmptyStr;
  if FileExists(Archivo) then
  try
    Stream:= TFileStream.Create(Archivo,fmOpenRead or fmShareDenyWrite);
    try
      Result:= CalcHash(Stream,Algorithm);
    finally
      Stream.Free;
    end;
  except end;
end;

function CalcHash2(Str: string; Algorithm: THashAlgorithm): string;
var
  Stream: TStringStream;
begin
  Result:= EmptyStr;
  Stream:= TStringStream.Create(Str);
  try
    Result:= CalcHash(Stream,Algorithm);
  finally
    Stream.Free;
  end;
end;

end.

Y hago la llamada con el siguiente codigo:

Código Delphi [-]
  if openDialog1.Execute then
    edit1.Text:= openDialog1.FileName;
    edit2.Text:= (CalcHash2(edit1.Text,haSHA1));

Devolviendome el siguiente valor alfanumerico/hex: "6dd7123776aaac7aa289b68ec03cccfeecd405d3"

Mi pregunta es ¿Ese sería el hash del archivo dado o sería el hash del contenido TEdit, tomado como cadena de texto? Espero haberme explicado.
Y por otra parte, si tengo un archivo de por ejemplo 10 Gb y lo corto con la aplicación hacha, ¿sería correcto obetener el hash del primer archivo
cortado .001? Y una vez unido de nuevo el archivo, ¿con que hash lo comparo para saber si se ha unido correctamente con el obtenido del archivo .001
y archivo unido?

Saludos y gracias de antemano.
[/color]
Responder Con Cita
  #8  
Antiguo 30-09-2013
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Como rayos vas a saber que:

Cita:
C:\\Archivo.txt
esta corrupto evaluando solo C:\\Archivo.txt? Se debe es hacer hash del archivo completo, no de su nombre o ubicación, de su contenido.

http://stackoverflow.com/questions/9...algorithm-work

http://www.makeuseof.com/tag/md5-has...ogy-explained/

Esto significa que el nombre del archivo no importa. Si archivo.zip y archivo.txt tienen el mismo contenido, el HASH dará igual.

Un hash es una función en un solo sentido que da como resultado la misma salida en base a la misma entrada, pero no se puede derivar en base a la salida cual fue la entrada.

Ten en cuenta que si haces un hash de un archivo de 5 Gigas y no tienes la precaución de procesar el archivo por batches usando un stream, cargaras los 5GB en memoria...
__________________
El malabarista.
Responder Con Cita
  #9  
Antiguo 01-10-2013
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.735
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Hay dos funciones en la unidad de Seoane.
A CalcHash le pasas la ruta y nombre del archivo y te devuelve su Hash.
CalcHash2 calcula el Hash de un string.

Código Delphi [-]
function CalcHash(Archivo: string; Algorithm: THashAlgorithm): string; overload;
var
  Stream: TFileStream;
begin
  Result:= EmptyStr;
  if FileExists(Archivo) then
  try
    Stream:= TFileStream.Create(Archivo,fmOpenRead or fmShareDenyWrite);
    try
      Result:= CalcHash(Stream,Algorithm);
    finally
      Stream.Free;
    end;
  except end;
end;

Por lo que tu código debe quedar así:
Código Delphi [-]
  if OpenDialog1.Execute then
    Edit1.Text:= OpenDialog1.FileName;
    Edit2.Text:= CalcHash(Edit1.Text, haSHA1);
Responder Con Cita
Respuesta



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
UPX ¿como funciona? JXJ Varios 3 08-02-2009 19:58:54
ClientDataSet, como funciona? Pollo2004 Varios 18 14-11-2008 13:26:19
como saber si la red funciona??? User_baja1 Varios 1 11-05-2005 20:07:25
¿Como funciona el TQRExprMemo? judoboy Impresión 2 18-07-2003 12:21:16
DBF Como funciona? Descendents Conexión con bases de datos 1 15-07-2003 22:39:00


La franja horaria es GMT +2. Ahora son las 16:00:27.


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