1

我们有一个用 c/c++ 编写的 Web 服务 在今天之前,用户密码只是简单地用 MD5 散列并存储在 DB 中我很清楚这个算法根本不安全

Web 服务是 1 个线程应用程序。平均而言,它每秒从用户那里收到约 100 个数据包(100p/s)。其中一些是身份验证数据包。

我读过关于 bcrypt 和 salts 的文章,但根本没有在实践中使用过这种技术。由于安全原因,bcrypt 产生的哈希值比 MD5 慢的事实对我来说也很清楚。如果我们采用这种方式并使用 bcrypt 或 scrypt 来加密密码和检查 auth 数据包,它会使我们的服务变得更慢吗?

4

1 回答 1

1

如果能减慢攻击向量的速度,安全性会更好。永远记住这一点。

至于加盐和散列,我建议您始终使用加盐,并使用良好的熵生成器并执行几轮散列函数。

为什么要加盐?

如果您直接从密码中使用哈希,您将获得哈希和密码的 1 对 1 表示(在最好的情况下)。加盐(特别是具有至少 32 位熵的强盐)可以阻止字典攻击。如果您的盐的熵低或位数较少,那么如果您的盐渍和散列密码被盗,您很容易受到彩虹表的攻击。

为什么要四舍五入?

舍入(像 bcrypt 一样应用几轮散列函数)增加了一些反馈散列,但更重要的是,增加了构建自定义彩虹表的成本。如果您在散列之前不加盐密码,则四舍五入没有任何作用。

为什么减速?

每当您输入无效凭据时,您会看到某些站点具有指数退避时间。这是为了禁止机器人暴力破解密码。如果您的服务器拥有重要数据,请始终进行指数退避。

作为一般信息,bcrypt进行 1000 轮散列,这就是为什么它很慢。

于 2012-08-29T17:34:27.350 回答