我发现以下示例代码(在网络上的某个地方,不记得在哪里):
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()的调用是否安全?
请注意,如果这不是一个重大的安全问题,我不会打扰任何人。
没错,可以安全删除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)
| 归档时间: |
|
| 查看次数: |
5722 次 |
| 最近记录: |