在Spring Security的BCrypt实现中,我遇到了以下方法(source):
static boolean equalsNoEarlyReturn(String a, String b) {
char[] caa = a.toCharArray();
char[] cab = b.toCharArray();
if (caa.length != cab.length) {
return false;
}
byte ret = 0;
for (int i = 0; i < caa.length; i++) {
ret |= caa[i] ^ cab[i];
}
return ret == 0;
}
为什么没有这种早退
equals
方法?它有什么好处:static boolean equals(String a, String b) {
char[] caa = a.toCharArray();
char[] cab = b.toCharArray();
if (caa.length != cab.length) {
return false;
}
for (int i = 0; i < caa.length; i++) {
if (caa[i] != cab[i]) {
return false;
}
}
return true;
}
甚至:
return a.equals(b)
?
是出于安全考虑吗?
最佳答案
我认为这是出于安全目的,以避免Timing攻击。即使与BCrypt无关紧要,这样做也是一个好习惯。 Here is an answer详细信息