2011-09-25 18 views
5

La domanda è semplice: quando dovrei chiamare la funzione reset() sulla classe java MessageDigest?Devo chiamare MessageDigest.reset() prima di usarlo?

La domanda proviene principalmente dalla OWASP reference, dove in un esempio di codice, lo fanno:

MessageDigest digest = MessageDigest.getInstance("SHA-1"); 
    digest.reset(); 
    digest.update(salt); 
    byte[] input = digest.digest(password.getBytes("UTF-8")); 

poi, in un ciclo, lo fanno:

for (int i = 0; i < iterationNb; i++) { 
     digest.reset(); 
     input = digest.digest(input); 
    } 

Ora, per me, sembra che il reset sia richiesto solo quando l'istanza digest è già stata "inquinata" con le chiamate all'aggiornamento. Quello nel primo campione, quindi, non sembra necessario. Se è necessario, è un'indicazione che l'istanza restituita da MessageDigest.getInstance non è thread-safe?

risposta

4

penso che tu abbia ragione, l'iniziale reset() non è necessario. documentation states:

Un oggetto MessageDigest viene inizializzato.

Anche l'esempio sulla documentazione di classe non include il ripristino iniziale.

Questo non ha nulla a che fare con la sicurezza del thread, la necessità di .reset() indica solo che getInstance() non esegue l'inizializzazione stessa.

Non si dovrebbe utilizzare lo stesso oggetto MessageDigest da più thread senza sincronizzazione in ogni caso: un hash è significativo solo se si conosce in quale ordine le parti sono state sottoposte a hash, altrimenti è solo un PRNG di fantasia non totalmente deterministico.

+0

TY, ha senso. Stavo cercando così tanto su google refs, ho dimenticato di rileggere l'intestazione della classe e getInstance() doc, quindi sono rimasto confuso. –

Problemi correlati