2013-10-21 14 views
6

Sto cercando di implementare le funzionalità hash da C a PHP, ma ho riscontrato un problema con encountred. Apprezzerei davvero avere un po 'di aiuto in questo.hashing incrementale in PHP vs C

Questo è il C-codice di hashing più volte:

SHA_CTX ctx; 
    SHA1_Init(&ctx); 
    SHA1_Update(&ctx, (const u_int8_t *) salt, strlen(salt)); 
    SHA1_Update(&ctx, (const u_int8_t *) argv[1], strlen(argv[1])); 
    SHA1_Final(temp, &ctx); 

Ma poi si arriva hashing di nuovo in un ciclo, e non v'è la parte difficile per me da implementare in php:

for (n = 0; n < 2 ; ++n) { 
     SHA1_Init(&ctx); 
     SHA1_Update(&ctx, (const u_int8_t *)salt, strlen(salt)); 
     SHA1_Update(&ctx, temp, SHA_DIGEST_LENGTH); 
     SHA1_Final(temp, &ctx); 
} 

SHA1_Init utilizza lo stesso contesto & ctx nel ciclo. Qualcosa che temo di non poter fare in php.

Questo è il mio codice php corrente:

$ctx = hash_init('sha1'); 
hash_update($ctx, $salt); 
hash_update($ctx, 'string'); 
$pw = hash_final($ctx); 

for ($round = 0; $round < 2; ++$round) { 
    $ctx = hash_init('sha1'); 
    hash_update($ctx, $salt); 
    hash_update($ctx, $pw); 
    $pw = hash_final($ctx); 
} 

Dall'output, posso vedere chiaramente che nel secondo tempo hash l'hash non è la stessa come in C:

C: 
cf584b11970312e4b973bc7b35870d7e019affcd 
cb1ea097e844363e4e76d512af4245c10ade1725 

PHP: 
cf584b11970312e4b973bc7b35870d7e019affcd 
3003969f9065d7614d7cf34675b9d9bf7584d7c3 

Come posso hash con il vecchio contesto in PHP? Non trovo alcuna documentazione su come farlo e non sono sicuro di dove vada storto.

Sarei grato per qualsiasi commento gentile su come risolvere questo problema!

+0

Hai provato a rimuovere "$ ctx = hash_init ('sha1');" nel tuo ciclo? – apoq

+0

Sì, questo risolve un errore e non viene prodotto alcun hash: Attenzione: hash_final(): 4 non è una risorsa di contesto hash valida, ma anche delle funzioni di aggiornamento. – Ms01

+0

Sarà più semplice aiutare se includi il codice completo sia per C che per PHP. – whooot

risposta

2

questo perché si utilizza il ciclo interno nell'array binario C (array di byte), ma nel PHP si utilizza la stringa con la rappresentazione esadecimale di questo array. Penso che sia più corretto:

$salt = 'salt'; 
$ctx = hash_init('sha1'); 
hash_update($ctx, $salt); 
hash_update($ctx, 'string'); 
$pw = hash_final($ctx, true); 
for ($round = 0; $round < 2; ++$round) { 
    $ctx = hash_init('sha1'); 
    hash_update($ctx, $salt); 
    hash_update($ctx, $pw); 
    $pw = hash_final($ctx, $round < 1); 
} 
echo $pw; 
+0

Il tuo commento lo ha risolto per me, ho solo aggiunto un if per verificare se era l'ultimo ciclo, quindi non ho usato il formato binario e questo lo ha risolto. Tyvm :) – Ms01

+0

Questo è il codice che lo ha risolto per me: http://paste.laravel.com/10Qp – Ms01