在使用之前我是否需要调用MessageDigest.reset()?

Fra*_*rre 5 java hash cryptography owasp

问题很简单:何时应该在java类MessageDigest上调用reset()函数?

问题主要来自OWASP参考,在代码示例中,它们执行:

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

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

   for (int i = 0; i < iterationNb; i++) {
       digest.reset();
       input = digest.digest(input);
   }
Run Code Online (Sandbox Code Playgroud)

现在,对我来说,只有在摘要实例已被"更新"调用"污染"后,才会看到重置.因此,第一个样本中的那个似乎没有必要.如果有必要,是否表明MessageDigest.getInstance返回的实例不是线程安全的?

Paŭ*_*ann 4

我认为你是对的,最初reset()是没有必要的。该文档指出

MessageDigest 对象一开始就已初始化。

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

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

无论如何,您不应该在没有同步的情况下从多个线程使用相同的 MessageDigest 对象:只有当您知道各部分的散列顺序时,散列才有意义,否则它只是一个奇特的非完全确定性 PRNG。