在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详细信息

10-08 20:14