根据此参考source code,功能 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;
}
我得到了作者的观点,使用xor&amp;或者使比较时间
一致,但现在我对 BCrypt 的密码感到困惑
验证,是否需要做同样的事情来避免定时攻击?
或 bcrypt 在散列后已经调整为一致吗?
所以它只是用“==”验证结果?
关于此的任何想法或文件/文章?感谢。
答案 0 :(得分:1)
源代码的作者有点偏执。定时攻击是一种理论攻击,只有在可以测量精确定时时才适用。他在博客上说明了这一点。如果您在任何Web客户端应用程序中使用bcrypt或PBKDF2进行密码散列,则实际上不可能进行定时攻击。与字符串比较过程相比,网络延迟会产生更多灰度噪声以响应时序。
由于您应该设置密码哈希对攻击者来说速度慢,但对用户来说速度合理(比如一个哈希值为200毫秒),字符串比较的差异在经典PC上几乎无法测量。
如果您仍然担心时间攻击,您可以在字符串比较之前随时添加随机睡眠。