在摘要()之前是MessageDigest.update()?

Pon*_*oni 4 java hash

我发现以下示例代码(在网络上的某个地方,不记得在哪里):

public static byte[] produce(final byte[] data)
        throws NoSuchAlgorithmException{
    MessageDigest digest = MessageDigest.getInstance(ALGORITHM);
    digest.reset();
    digest.update(data);
    byte[] ret = digest.digest(data);
    for (int i = 0; i < HASH_ITERATIONS; i++) {
        digest.reset();
        ret = digest.digest(ret);
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

让我感到困扰的是,文档中说digest()已经通过传递的输入单独调用了update():

使用指定的字节数组对摘要执行最终更新,然后完成摘要计算。也就是说,此方法首先调用update(input),将输入数组传递给update方法,然后调用digest()。

此外,在调用update()之后,MessageDigest对象的state变为1
在调用digest()(代码的下一部分)之后,它返回为simple 0
最后,在调试过程中逐步执行时,我可以清楚地看到正在对数据进行操作。

因此,删除对update()的调用是否安全?

请注意,如果这不是一个重大的安全问题,我不会打扰任何人。

Mer*_*nne 5

没错,可以安全删除update代码。而且,通过调用update(data)然后再调用,digest(data)您实际上将计算包含data两次的不同消息的摘要。我认为这不是您所需要的。

常见的使用情况digest(byte[])是计算完整数据块的摘要(即密码)。该update(byte[])成对使用digest(),当你需要计算消化数据的零件来的使用:

int read = 0; 
while ((read = fis.read(buffer)) != -1) {
    md.update(buffer, 0, read);
};
byte[] digest  = md.digest();
Run Code Online (Sandbox Code Playgroud)