gpt4 book ai didi

java - MessageDigest.update() 在 digest() 之前?

转载 作者:搜寻专家 更新时间:2023-11-01 02:30:56 25 4
gpt4 key购买 nike

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

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;
}

令我困扰的是,文档说 digest() 已经使用传递的输入自行调用了 update():

Performs a final update on the digest using the specified array of bytes, then completes the digest computation. That is, this method first calls update(input), passing the input array to the update method, then calls digest().

此外,在调用 update() 之后,MessageDigest 对象的 state 变为 1
在调用 digest() 之后(代码中的下一个),它返回为简单的 0
最后,边调试边单步执行,可以清楚的看到数据是被操作的。

那么,删除对 update() 的调用是否安全?

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

最佳答案

你是对的,删除代码中的 update 是安全的。此外,通过调用 update(data),然后调用 digest(data),您实际上计算了两次包含 data 的不同消息的摘要。我认为这不是您需要的。

digest(byte[]) 的常见用例是计算完整数据 block 的摘要(即密码)。 update(byte[])digest() 配对使用,当您需要计算来自各部分的数据摘要时使用:

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

关于java - MessageDigest.update() 在 digest() 之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9550858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com