加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 19:16:12 所属栏目:Java 来源:网络整理
导读:问题很简单:何时应该在java类MessageDigest上调用reset()函数? 问题主要来自OWASP reference,在代码示例中,它们执行: MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.reset(); digest.update(salt); byte[] input = digest.digest(p

问题很简单:何时应该在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返回的实例不是线程安全的?

> OWASP hashing recommendation
> Random article on hashing,does not contain initial reset

最佳答案
我认为你是对的,初始reset()是没有必要的. documentation states:

A MessageDigest object starts out initialized.

类文档中的示例也不包括初始重置.

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

您不应该在没有同步的情况下使用来自多个线程的相同MessageDigest对象:只有当您知道部件被散列的顺序时,散列才有意义,否则它只是一个奇特的不完全确定的PRNG.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读