5

我盲目地遵循了 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);
}

我观察到的是,即使在更改时签名也保持不变serialNumber。如果我省略了“reset()”调用,sig 确实会改变......

4

2 回答 2

9

如果您reset已经使用了MessageDigest. reset在这里调用以清除所有以前的设置。

MessageDigest.getInstance是一种工厂方法而不是单例,因此附加了大量开销。

MessageDigest.getInstance

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

所以最好重复使用并避免MessageDigest.getInstance再次调用的开销。

于 2012-12-10T14:18:04.350 回答
7

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

就您而言,我还认为您需要省略对reset(). 否则,您将放弃从盐和有效负载中获得的任何好处。循环内部的调用reset()是不必要的,但不应更改计算结果。

希望有帮助。

于 2012-12-10T15:22:50.090 回答