根据这个参考源代码,函数 SlowEquals
private static bool SlowEquals(byte[] a, byte[] b)
{
uint diff = (uint)a.Length ^ (uint)b.Length;
for (int i = 0; i < a.Length && i < b.Length; i++)
diff |= (uint)(a[i] ^ b[i]);
return diff == 0;
}
我明白作者的观点是使用异或或使比较时间
一致,但现在我对BCrypt的密码感到非常困惑
验证,是否需要做同样的事情来避免定时攻击?
还是 bcrypt 在散列后已经调整为一致?
所以它只是用"=="验证结果?
对此有任何想法或文档/文章吗?谢谢。
的作者有点偏执。定时攻击是一种理论攻击,仅适用于可以测量精确定时的情况。他在博客上说明了这一点。如果您在任何 Web 客户端应用程序中使用 bcrypt 或 PBKDF2 进行密码哈希,则定时攻击几乎是不可能的。与字符串比较过程相比,网络延迟对响应时序产生更多的灰色噪声。
由于您应该将密码哈希设置为对攻击者来说很慢,但对用户来说相当快(例如一个哈希为 200 毫秒),因此字符串比较的差异在经典 PC 上几乎无法测量。
如果您仍然担心定时攻击,您可以随时在字符串比较之前添加随机睡眠。