2011-09-25 12 views
5

La pregunta es simple: ¿cuándo debo llamar a la función reset() en la clase java MessageDigest?¿Debo llamar a MessageDigest.reset() antes de usarlo?

La pregunta proviene principalmente de la OWASP reference, donde en un ejemplo de código, que hacen:

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

entonces, en un bucle, que hacen:

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

Ahora, para mí, Parece que el restablecimiento solo es necesario una vez que la instancia de resumen ya ha sido 'contaminada' con llamadas para actualizar. El que está en la primera muestra, por lo tanto, no parece necesario. Si es necesario, ¿es una indicación de que la instancia devuelta por MessageDigest.getInstance no es segura para subprocesos?

Respuesta

4

creo que tiene razón, la inicial reset() no es necesario. El documentation states:

Un objeto MessageDigest se inicializa.

También el ejemplo en la documentación de la clase no incluye el restablecimiento inicial.

Esto no tiene nada que ver con la seguridad de la rosca, la necesidad de .reset() indicaría que getInstance() no realiza la inicialización.

No debe utilizar el mismo objeto MessageDigest de múltiples hilos sin sincronización de todos modos: Un hash solo es significativo si sabe en qué orden las partes fueron hash, de lo contrario es simplemente un PRNG sofisticado no totalmente determinista.

+0

TY, tiene sentido. Estaba mirando tanto a las referencias de Google, olvidé volver a leer el encabezado de la clase y el documento getInstance(), así que terminé confundido. –

Cuestiones relacionadas