java - 我需要在使用之前调用 MessageDigest.reset() 吗?

标签 java hash cryptography owasp

问题很简单:什么时候调用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/

相关文章:

java - 为什么这种在 Java 数组中查找最大数组的通用方法无法编译?

c++ - 我在这个布隆过滤器实现中做错了什么?

java - 将字符串转换为散列,然后再重新生成字符串

java - RSA 逐 block 加密对大于 1kb 的文件产生空白输出

java - 使用 Windows 下生成的 (.PFX) 证书对 Java 中的文本进行签名

java - 无法将 CoreNLP Shift-Reduce 模型加载到 CoreNLP jar 中

java - GXT 3 更改选项卡样式(添加 css)

java编程线程异常 "main"这个错误是什么?

python - 动态增长/流数据的哈希算法?

Java SecretKeyFactory生成的 key 与输入密码相同