在判断相等时有一种写法是
fn safe_equals(a: &str, b: &str) -> bool {
let mut a = a.as_bytes();
let mut b = b.as_bytes();
if a.len() != b.len() {
return false;
}
let mut equal: u8 = 0;
for i in 0..a.len() {
equal |= a[i] ^ b[i];
}
return equal == 0;
}
这是用来防止时序攻击,常见的等于会是发现第一个、第二个不匹配项时返回 false,这些会出现时间差异,值越贴近正确值的耗时越长,这样可以利用统计学去统计每个字符的耗时从而根据最长耗时串试出正确值
这种暴力猜测应该不适用于 web,应该没有什么服务器会允许同一个 IP 同一个时间段的大量请求