【问题标题】:C# bcrypt and pbkdf2 verify password function differenceC# bcrypt 和 pbkdf2 验证密码功能的区别
【发布时间】:2015-05-18 09:06:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# pbkdf2 rfc2898 bcrypt.net


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢关于“随机睡眠”的观点,我之前没有考虑过,但是如果我想比较字节,我应该从哪里开始?是否可以将 bcrypt 方程更改为字节异或比较?
    猜你喜欢
    • 2012-07-09
    • 2016-10-20
    • 2016-01-13
    • 2020-02-29
    • 2014-10-20
    • 1970-01-01
    • 2016-02-27
    • 2021-10-25
    • 2019-06-02
    相关资源
    最近更新 更多