我今天和一位朋友讨论了他的密码哈希比较。我认为你不能在你遇到的第一个哈希不匹配时返回 false,我给他发了一个链接,指向一篇关于 Java 6 中发生的 Java 计时攻击的文章。
public static boolean isEqual(byte digesta[], byte digestb[]) {
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[]) {
boolean isEquals = true;
//this avoid a possible timing attack
for (int i = 0; i < digesta.length; i++) {
if (digesta[i] != digestb[i]) {
isEquals = false;
}
}
return isEquals;
}
对我来说,这表明可能存在时间攻击,因为如果哈希中存在不匹配,则返回 false。他认为这不会对应用程序构成风险,重要的是密码是加盐和散列的,这可能不会影响应用程序的安全性。
我是否对我的应用程序的安全性感到偏执?