2012-12-10 127 views
2

我一直在盲目地遵循OWASP关于java中的散列生成的建议(see here),并且我不确定我是否做得正确。具体而言,我不确定MessageDigest.reset()的目的和效果,因此何时以及如何使用它。什么时候使用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); 
} 

我正在观察的是,签名保持不变,即使serialNumber正在发生变化。如果我忽略'reset()'调用,sig会改变...

+0

可能重复[在使用它之前是否需要调用MessageDigest.reset()?](http://stackoverflow.com/questions/7546549/do-i-need-to-call-messagedigest-reset-before -using-it) – durron597

回答

5

如果您已经使用MessageDigest的实例,则只需致电reset即可。在此调用reset以清除以前的所有设置。

MessageDigest.getInstancefactory method而不是singleton所以有附加的重大开销。

MessageDigest.getInstance

MessageDigest对象封装来自返回支持指定算法的Provider MessageDigestSpi实现。

因此重新使用并避免再次调用MessageDigest.getInstance的开销会更好。

+0

所以OWASP的例子和我的代码都是错的,是吗?如果我总是得到一个新的实例,我根本不需要'重置'? – Hank

+0

我会去重置和重新使用:) – Reimeus

+0

@Hank - 你并不总是得到一个新的实例,因为'.getInstance'在循环之外。在这里使用'.reset'很好。 – webnoob

5

代码在我看来......也许我错在这里读,但docsdigest()隐式重置实例。因此,如果您有以下情况,请致电reset():1)以前称为update(); 2)需要重新使用实例,但不需要update()调用的结果。

在你的情况下,我也认为你需要忽略第一个电话reset()。否则,你会从盐和有效载荷中剔除任何好处。循环内对reset()的呼叫是不必要的,但不应改变计算结果。

希望有所帮助。

+0

完全同意,最初的代码*是在首先执行reset()调用时关闭的。感谢关于隐式重置的指针! – Hank

相关问题