2011-09-25 58 views
5

问题很简单:何时应该在java类MessageDigest上调用reset()函数?在使用它之前是否需要调用MessageDigest.reset()?

的问题主要来自OWASP reference,其中的代码示例中,他们这样做:

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

然后,在一个循环中,他们这样做:现在

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

,对我来说,看起来好像仅当摘要实例已被调用更新的“污染”时才需要重置。因此,第一个样品中的那个似乎不是必需的。如果有必要,是否表示由MessageDigest.getInstance返回的实例不是线程安全的?

回答

4

,我认为你是对的,最初的reset()是没有必要的。 documentation states

MessageDigest对象开始初始化。

此外类文档上的示例不包括初始重置。

这与线程安全无关,.reset()的必要性只会表明getInstance()本身不会执行初始化。

不应该在多个线程中使用同一个MessageDigest对象,而无需同步:只有当您知道部件被散列的顺序时,散列才有意义,否则它只是一个看似不完全确定的PRNG。

+0

TY,有道理。在google的参考文献中看到这么多,忘了重新读取类头和getInstance()doc,所以我最终感到困惑。 –

相关问题