gpt4 book ai didi

java - MessageDigest.isEqual 函数在 Java 中的使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:48 24 4
gpt4 key购买 nike

我有两个问题我不明白。请帮我看看。谢谢。

  1. What is the use of MessageDigest.isEqual function in Java?

  2. Explain why, in some versions prior to Java SE 6 Update 17, it was vulnerable to a timing attack.

最佳答案

查看 Java SE 6 Update 10 实现,我们看到:

public static boolean isEqual(byte digesta[], byte digestb[]) {

if (digesta.length != digestb.length)
return false;

for (int i = 0; i < digesta.length; i++) {
if (digesta[i] != digestb[i]) {
return false;
}
}
return true;
}

修复后我们看到:

public static boolean isEqual(byte[] digesta, byte[] digestb) {
if (digesta.length != digestb.length) {
return false;
}

int result = 0;
// time-constant comparison
for (int i = 0; i < digesta.length; i++) {
result |= digesta[i] ^ digestb[i];
}
return result == 0;
}

旧的实现似乎更有效,因为它在找到第一个不相等的字节时返回 false,但我假设它已被替换,因为它可能允许调用者测试如何基于方法的运行时间,两个输入字节数组彼此相似。

新实现始终具有相同的运行时间(对于相同长度的数组),因为它遍历整个数组(即使数组的第一个字节不同)。

我搜索了调用此方法的位置。一个示例是 com.sun.org.apache.xml.internal.security.algorithms.implementations.IntegrityHmac 类中的 engineVerify(byte[] signature),它测试是否通过将其与某个内部字节数组进行比较,传递给它的签名字节数组是有效的。在修复之前,通过测量该方法的运行时间,您可以尝试生成一个可以通过比较的字节数组(方法运行时间越长意味着两个数组的前缀越大)。

关于java - MessageDigest.isEqual 函数在 Java 中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33626298/

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