C# bcrypt 和 pbkdf2 验证密码功能差异



根据这个参考源代码,函数 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 上几乎无法测量。

如果您仍然担心定时攻击,您可以随时在字符串比较之前添加随机睡眠。

最新更新