在DB中存储salt +密码哈希并防止密码攻击

时间:2012-03-19 07:34:21

标签: security hash cryptography dictionary-attack

请帮助我理解。我也不是在谈论SSL或DH密钥交换。 由于盐存储在数据库中,并且是攻击者只是保护用户原始密码(彩虹表)的秘密,以防攻击者获取实际数据库本身。那么你将如何防范基于暴力/字典的攻击。再一次,记录错误的请求并拒绝IP许多不良请求是已知的,我在这里谈论加密。由于user1的密码相同,攻击者从其他网站获取密码,盐在这里如何保护。我猜不是,那么什么是阻止此类攻击的最佳解决方案。假设数据非常重要,比如信用卡号+ CVV(我知道不存储CVV,但这不是问题)。

编辑:顺便说一下,我提出了一些愚蠢的想法,它看起来像一种停止字典攻击的已知方法。阅读更多此问题:High cost encryption but less cost decryption

可能我们可以在这里讨论一些其他方法,以防止暴力/字典/社交工程密码攻击

4 个答案:

答案 0 :(得分:3)

我有点不清楚你的实际问题是什么,但如果它是“盐有助于保护我免受暴力攻击?”答案是从技术上讲它没有。没有什么关于盐使蛮力攻击更加困难,盐反而使得难以同时暴力破坏多个账户。本质上,盐会人为地增加进行暴力攻击所需的搜索空间,使计算上难以预先计算每个可能的密码,然后针对整个数据库进行检查。盐可以以透明的方式存储,只要它们对每个密码都是唯一的。

如果你想使暴力破解密码更加困难,你想要的是一种自适应散列方案。这些方案允许您指定哈希应该花多长时间。因为一个诚实的客户端应该只需要进行数十次的认证,但是攻击者需要在数百万或数十亿次的数量级上进行身份验证,较慢的哈希值会使攻击者几乎无法完成任务,同时在系统。

这一切归结为如果你是哈希密码你应该使用bcrypt。它被设计为包含盐并且是自适应散列系统。有关详细信息,请参阅this article on security.stackexchange.com

答案 1 :(得分:2)

关于salt:如果您使用谷歌等搜索引擎搜索“MD5”加密密码,您可以在这里找到原始的普通密码。但是如果你在普通密码中混合盐然后应用“MD5”加密,你将无法找到它。如果任何黑客无论如何攻击您的数据库,如果您只使用MD5加密,那么他可能会使用上述方法来破解密码。对于例如在谷歌搜索此字符串:5f4dcc3b5aa765d61d8327deb882cf99,您将获得原始密码字符串。主要添加盐以防止此类攻击。

结帐here。在这里看一下Just content和concept来理解。这是来自Spring安全文档。

答案 2 :(得分:1)

盐的目的不是为了防止字典攻击;它是为了防止像彩虹表这样的预计算攻击。拥有盐需要攻击者在获得对数据库的访问权后单独攻击每个密码;他们不能预先计算字典中的密码哈希值,也不能在用户之间重复使用这种功能。

密码拉伸是一种通过增加攻击者测试每个候选密码所需的工作量来使字典攻击更加困难的方法。

答案 3 :(得分:0)

如果没有盐,攻击者可以使用离线攻击来预先计算常见密码的哈希值:“secret”“qwerty”等。没有盐允许攻击者告诉不同用户何时使用相同的密码,因为他们将拥有相同的哈希。 Salt可防止预先计算并避免匹配的哈希问题。

有权访问数据库的攻击者也可以访问salt。由于盐的不同,她需要单独攻击每个密码。

使用拉伸(重复散列)也会减慢攻击者的速度。而不是存储hash(password + salt)存储hash^n(password + salt),而n足够大,整体计算至少需要0.1秒。这限制了攻击者每秒约十次审判,同时对用户没有明显的影响。