问题很简单:什么时候调用java类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返回的实例不是线程安全的?
最佳答案
我认为你是对的,初始的 reset()
是没有必要的。 documentation states :
A MessageDigest object starts out initialized.
此外,类文档中的示例不包括初始重置。
这与线程安全无关,.reset()
的必要性仅表明 getInstance()
本身不进行初始化。
你不应该在没有同步的情况下从多个线程使用同一个 MessageDigest 对象:只有当你知道散列部分的顺序时散列才有意义,否则它只是一个花哨的不完全确定的 PRNG。
关于java - 我需要在使用之前调用 MessageDigest.reset() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7546549/