2009-03-30 10 views
9

Sto eseguendo del codice che ho scritto in C che chiama la funzionalità di hashing md5 da una libreria di hashing che qualcun altro ha scritto (md5.c & md5.h). Il comportamento strano che ho visto è:L'hash MD5 calcola in modo diverso sul server

hashing perfettamente funzionante = Ho cancellato una stringa, e viene fuori l'hash esatto che ho verificato che sia con più altre fonti.

  1. hash funzionalità funziona perfettamente quando compilare ed eseguire sulla mia macchina OSX e l'hash che viene calcolata è esattamente come dovrebbe essere .

  2. Stesso codice, nessuna modifica viene caricato e compilati sulla base di Linux server e si calcola un diverso (sbagliato) di hash.

Qualcuno ha qualche idea su come esattamente questo sarebbe possibile? Ha fatto impazzire la scorsa settimana e non capisco perché sia ​​possibile. L'ho anche testato su un'altra macchina, compilato ed eseguito e funziona perfettamente. E 'proprio quando lo carico sul server che l'hash non è più corretto.

Il file funzionalità di hashing sono disponibili all'indirizzo: http://people.csail.mit.edu/rivest/Md5.c

RISOLTO: Grazie a tutti E 'stato il problema di arco a 64 bit. La sua potente fastidioso che quel passato di mente di considerare che durante il debug .......

+0

Per chiarire, si intende che il codice compilato che deve effettuare una chiamata di libreria alla funzione di hashing MD5 restituisce il risultato errato? In tal caso, hai verificato che lo stesso _input_ venga fornito sia sul server che localmente? Puoi eseguire il debug-print appena prima di inviarlo per essere sicuro? –

+0

Sì, il codice compilato che non cambio, semplicemente il caricamento sul server mi dà un risultato diverso per l'hash. Ho persino inserito una variabile statica che non cambia mai e che verifica l'input subito prima della chiamata alla funzione e mi dà due diversi hash. È molto strano. –

+0

Per favore chiarisci - tu carichi il file binario o carica la fonte e compili? – sharptooth

risposta

19

provare a sostituire (linea Md5.c 41)

typedef unsigned long int UINT4;

da

typedef uint32_t UINT4;

(includere stdint.h se necessario)

Su una macchina lunga 64 bit int sono (di solito) 64 bit di lunghezza invece di 32

EDIT:

ho provato su un opteron 64 bit questo risolve il problema.

+0

Grazie Ben. Questo ha risolto il problema anche per me. Anche se in realtà ho trovato il typedef in un file chiamato global.h – pxb

+0

La tua risposta era come kryptonite per me. Grazie mille! – iankits

1

Diversi compilatori possono avere diversi livelli di conformità standard. Se ci si imbatte in un compilatore sub-standard si possono avere tempi difficili nel vedere che il codice ben collaudato è stato compilato per qualcosa di completamente diverso.

Può anche accadere che il sistema di destinazione sia a 64 bit e il codice abbia problemi di portabilità a 64 bit.

L'unico modo per risolvere il problema è eseguire il debug in cui esattamente le due versioni del codice si comportano in modo diverso.

2

La macchina sembra non funzionare con un'architettura diversa (32 bit rispetto a 64 bit) rispetto alle altre? Se l'implementazione di MD5 dipende dalla dimensione della parola macchina (non ho controllato il codice), ciò può causare l'hash di essere diverso.

0

Siamo spiacenti, no. Se compilo che ed eseguirlo sulla mia macchina Linux x86 produce lo stesso risultato dell'utilità md5sum:

 
peregrino:$ md5sum csrc/Md5.c 
d27fd5f04426a3ccb2390d7517f21b9c csrc/Md5.c 
peregrino:$ bin/Md5 csrc/Md5.c 
d27fd5f04426a3ccb2390d7517f21b9c csrc/Md5.c 

Sulla mia macchina x64:

 
sandiego:$ bin/Md5 src/Md5.c 
09679964608e3335c5c3e14572373eef src/Md5.c 

Così sembra essere un po '64 problema, piuttosto che un problema di Linux.

+0

molto probabilmente perché la macchina è a 32 bit ... – Ben

+0

La mia macchina x64 ha programmato un controllo del disco quando l'ho avviato, quindi ci è voluto un po 'per iniziare ... –

0

Ti sei assicurato che stai leggendo in modalità binaria? In caso contrario, una nuova riga verrà convertita in modo diverso in un diverso sistema operativo.

Problemi correlati