C#bcrypt和pbkdf2验证密码功能的区别

时间:2015-03-16 09:44:46

标签: c# pbkdf2 rfc2898 bcrypt.net

根据此参考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 在散列后已经调整为一致吗?

所以它只是用“==”验证结果?

关于此的任何想法或文件/文章?感谢。

1 个答案:

答案 0 :(得分:1)

源代码的作者有点偏执。定时攻击是一种理论攻击,只有在可以测量精确定时时才适用。他在博客上说明了这一点。如果您在任何Web客户端应用程序中使用bcrypt或PBKDF2进行密码散列,则实际上不可能进行定时攻击。与字符串比较过程相比,网络延迟会产生更多灰度噪声以响应时序。

由于您应该设置密码哈希对攻击者来说速度慢,但对用户来说速度合理(比如一个哈希值为200毫秒),字符串比较的差异在经典PC上几乎无法测量。

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