在线暴力攻击
事实上,没有实施某种形式的在线暴力攻击保护的网站正在泄露用户的密码。许多站点没有任何形式的保护,而许多其他站点则有。
简单阻塞有问题:
- 如果我们在 x 次尝试失败后阻止用户的 IP,则 10'000 强僵尸网络将尝试 x* 10'000 个密码。在 100'000 次尝试时,许多较弱的密码已经被破解。
- 如果我们在 x 次尝试失败后阻止用户的帐户,则任何攻击者都可以阻止任何用户的帐户。
这意味着防御需要更加复杂,或者我们可以简单地忽略防御并在最终崩溃时试图责怪用户,这不合道德。更复杂的方案结合了对可疑活动的检测和有条件的更强登录要求。
为了检测可疑活动,我们会根据过去的成功登录来跟踪积极迹象,例如用户的 ISP 和用户之前登录的设备的某些标识符。我们还可以使用负面迹象,例如来自“受污染”的 ISP 或国家/地区的 IP,或者登录尝试的快速增加。
在更强的登录要求方面,我们可以使用短超时、验证码、多因素身份验证,甚至黑名单。
离线暴力攻击
一旦我们心怀不满的系统管理员在黑市上出售了我们的密码数据库的副本,上述所有措施都无济于事,因为攻击者可以自己对密码进行哈希处理,看看它是否与数据库匹配。破解散列可能很便宜也很容易,或者仍然很容易但非常昂贵,这取决于我们如何对密码进行散列 请参阅:如何安全地散列密码?
盐:为了让攻击者更难破解整个数据库,我们使用盐,这使得每个散列略微唯一。每个用户都有不同的盐,它存储在散列旁边。这意味着攻击者不能只计算一个密码的哈希值并将其与每个用户的哈希值进行比较,而是攻击者必须为他尝试针对每个用户的每个密码计算一个新的哈希值。使用盐不会增加获取单个用户密码的成本。
昂贵的哈希:没有攻击者可以每秒暴力破解 1000 亿个密码,除非哈希方案是由白痴设置的(这是合理的)。一些攻击者可以每秒计算 1000 亿个基本哈希值,如 sha256,但解决方案只是不使用基本哈希值对密码进行哈希处理。一个简单的解决方案是,我们的哈希实际上hash =sha256(password, salt)不是 ,而是hash =sha256(sha256(sha256(.......(password, salt)...)password, salt)password, salt),我们在其中使用了大约 100'000 次 sha256 迭代,使任何攻击的成本高出 100'000 倍。实际上,这种防御过于简单,无法用专用硬件破解,因此在实践中,我们使用特殊的密钥派生函数,bcrypt并scrypt以任何攻击者计算成本高昂的方式混合多个基本哈希,而不管硬件如何。