【发布时间】:2017-11-14 22:46:03
【问题描述】:
我在产品代码中遇到了以下代码 sn-p。它使用按位异或进行字符串比较。这比String.equals(Object o) 方法好吗?作者想在这里达到什么目的?
private static boolean compareSecure(String a, String b)
{
if ((a == null) || (b == null)) {
return (a == null) && (b == null);
}
int len = a.length();
if (len != b.length()) {
return false;
}
if (len == 0) {
return true;
}
int bits = 0;
for (int i = 0; i < len; i++) {
bits |= a.charAt(i) ^ b.charAt(i);
}
return bits == 0;
}
对于上下文,被等同的字符串是身份验证令牌。
【问题讨论】:
-
这是比较字符串的一种较慢的方式,因为它必须始终比较所有字符。它并不比
String.equals()更安全。 -
@FredK 不正确。重新阅读第一个
if语句。这实际上可能是对String.equals()的唯一改进:它是空安全的,也许这就是“安全”部分。在 Java 7+ 中,您可以使用Objects.equals()获得相同的 null 安全行为 -
这比标准的
equals不安全。 -
@Zong 没有碰撞问题。它使用的是
bits |=,而不是bits ^=。如果任意两个字符不相等,则设置一个或多个位,并保持设置直到结束。 -
这个比较的目的是尽量不受字符串内容的影响,以防止计时攻击(正常的字符串比较会泄露关于等前缀有多长的信息)。
标签: java bitwise-operators bitwise-xor