0

根据this reference 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 & 或将比较时间设为

一致,但现在我对BCrypt的密码感到很困惑

验证,是否需要做同样的事情来避免时序攻击?

或者bcrypt在散列后已经调整为一致?

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

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

4

1 回答 1

1

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

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

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

于 2015-03-17T05:57:28.740 回答