Java 何时使用MessageDigest.reset()

Java 何时使用MessageDigest.reset(),java,hash,owasp,message-digest,Java,Hash,Owasp,Message Digest,我盲目地遵循了OWASP关于java()中哈希生成的建议,我不确定我是否正确地完成了它。具体来说,我不确定MessageDigest.reset()的用途和效果,因此也不确定何时以及如何使用它 我通过update()ing多次使用需要签名的不同值来“加载”我的salt和有效负载。我应该事先重置摘要吗?还是之后 为什么摘要在循环中是reset()(参见示例) 这是我的密码: MessageDigest md = MessageDigest.getInstance("SHA-256"); md.up

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

  • 我通过
    update()
    ing多次使用需要签名的不同值来“加载”我的salt和有效负载。我应该事先重置摘要吗?还是之后
  • 为什么摘要在循环中是
    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);
    }
    
    MessageDigest md=MessageDigest.getInstance(“SHA-256”);
    医学博士(salt);
    md.update(有效载荷1);//有效载荷的第1部分
    md.update(payload2);//有效载荷的第2部分
    md.update(序列号);//有效载荷的第3部分
    md.reset();
    字节[]sig=md.digest();
    
    对于(int i=0;i您只需调用
    reset
    ,如果您已经使用了
    MessageDigest
    reset
    的实例,就可以在此处调用该实例以清除所有以前的设置

    MessageDigest.getInstance
    是一个而不是一个so,附加了大量开销

    发件人:

    返回一个新的MessageDigest对象,该对象封装了来自支持指定算法的第一个提供程序的MessageDigestSpi实现


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

    代码看起来很像我……也许我在这里读错了,但是say
    digest()
    隐式地重置了实例。因此,如果之前调用了
    update(),那么您应该调用
    reset()
    和2)需要重新使用实例,但不需要
    update()
    调用的结果

    在您的情况下,我还认为您需要省略对
    reset()
    的第一个调用。否则,您将失去盐和有效载荷带来的任何好处。在循环内调用
    reset()
    是不必要的,但不应更改计算结果


    希望能有所帮助。

    所以OWASP示例和我的代码是错误的,是吗?如果我总是得到一个新实例,我根本不需要重置
    reset
    ?我会使用reset&re-use:)@Hank-你并不总是得到一个新实例,因为
    。getInstance
    在循环之外。在这里使用
    .reset
    很好。谢谢,您的回答和对它们的思考(tm)完全回答了我的问题!完全同意,原始代码先关闭wrt
    reset()
    call。感谢关于隐式重置的指针!可能重复的