何时使用MessageDigest.reset()

Han*_*ank 2 java hash owasp message-digest

我盲目地遵循了OWASP关于java中哈希生成的建议(见这里),我不确定我是否已经正确地完成了它.具体来说,我不确定其用途和效果MessageDigest.reset(),以及何时以及如何使用它.

  1. 我正在通过update()摘要多次使用不同的值来"加载"我的盐和有效负载,这些值完全需要签名.我应该reset()事先消化吗?还是之后呢?
  2. 为什么摘要reset()在循环内(参见示例)?

这是我的代码:

MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(salt);
md.update(payload1);  // part 1 of payload
md.update(payload2);  // part 2 of payload
md.update(serialNumber);  // part 3 of payload
md.reset();
byte[] sig = md.digest();
for (int i=0; i<1000; i++) {
  md.reset();
  sig = md.digest(sig);
}
Run Code Online (Sandbox Code Playgroud)

我所观察到的是即使在serialNumber变化时签名仍然保持不变.如果我省略'reset()'调用,sig确实会改变...

Rei*_*eus 5

reset如果您已经使用过该实例,则只需要调用MessageDigest.reset正在这里调用以清除所有以前的设置.

MessageDigest.getInstance工厂方法而不是单身,因此附加了很大的开销.

来自MessageDigest.getInstance:

将返回一个新的 MessageDigest对象,该对象封装来自第一个支持指定算法的Provider的MessageDigestSpi实现.

因此最好重复使用并避免MessageDigest.getInstance再次呼叫的开销.


bim*_*api 5

代码向我看来......也许我在这里读错了,但文档digest()隐含地重置了实例.因此,reset()如果您有1)之前调用过,update()并且2)需要重新使用该实例,则需要update()调用,但不需要调用的结果.

在你的情况下,我也认为你需要省去第一个电话reset().否则,您将从盐和有效负载中丢失任何好处.reset()循环内部的调用是不必要的,但不应改变计算结果.

希望有所帮助.