问题很简单:何时应该在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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。