首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PBKDF2怎么会比普通散列甚至HMAC好得多呢?

PBKDF2怎么会比普通散列甚至HMAC好得多呢?
EN

Cryptography用户
提问于 2019-08-30 07:14:02
回答 4查看 3.5K关注 0票数 2

我不知道密钥长度扩展攻击是如何工作的。所以,如果我们把这一次放在一边,说一下通常对散列的野蛮攻击,我真的不知道为什么PBKDF2比通常的散列要好得多。

从数学上讲,我知道PBKDF2能够更好地抵御彩虹表攻击,而且重建速度也很慢,但是随着计算能力在世界上的不断提高,它如何保持其完整性呢?

对于HMAC,我们使用salt,对于通常的散列,我们也可以这样做。

所以,SHA256('Hello'),很容易被彩虹摆在桌面上。因此,如果我添加了一个salt,它会更好一些,比如SHA256(salt+msg),但是salt通常以明文的形式保存在DB中,所以如果一些黑客能够破解该盐,他可以手动添加salt并执行相同的操作。

现在在HMAC中,-> H( key (opad) + h(salt +key))在数学上是安全的,但通过运行HMAC操作(如果他知道salt),可以很容易地强行强制所有可能的密码,并得到密钥。稍微慢一点,但有可能,在pbkdf2中,整个过程甚至被循环了一百万次,而且数学上的复杂性也很高,但是,如果你得到盐的话。他可以通过另一个pbkdf2函数运行一大串密码,可能非常慢,但仍然有可能,对吧?

  • 那么,如果这种复杂的算法仍然很容易出现更慢的蛮力,那么通过散列和散列处理HMAC的先前结果又有什么用呢?
EN

回答 4

Cryptography用户

发布于 2019-08-30 15:06:44

  • 如果您对每个用户使用不同的salt,密码哈希的salt可以减轻彩虹表(和类似并行彩虹表搜索机)等多目标攻击。实际上,对于每个用户来说,不同的salt意味着每个用户使用的哈希函数略有不同,因此,对相同哈希函数的许多实例进行任何批处理攻击的优势就消失了。这同样适用于香港发展基金、PBKDF2、氪星、argon2id,甚至\operatorname{MD5}(\mathit{salt} \mathbin\| \mathit{password})
  • 密码哈希的成本参数-迭代、内存和并行-增加了测试密码猜测的成本。知道密码的合法用户只需支付一次(如果他们是胖手指的话,则支付两到三次)。不知道密码的对手必须为每次猜测付出代价。但你和对手有点不同。您,合法的用户,希望在无聊之前进行身份验证或密钥派生,当您正在哈希单个密码时-您关心的是延迟。对手不在乎是否需要1秒或1小时才能准确测试单个密码猜测;串行密码猜测机在一小时内一秒一次地尝试3600个密码,而并行密码猜测机则在一小时内同时尝试3600个密码,并最终得到所有密码的答案,但对手仍然会给出一个密码--猜测率为3600/小时--对手关心的是吞吐量,或者是价格/性能比,以确定通过向任务投入更多资金,他们可以获得多少吞吐量。这个专门的对手将使用他们可以使用的所有工具--不仅在笔记本电脑上运行密码破解器,还可能在GPU或FPGA上运行密码破解器,甚至在硅芯片上制造特定应用的集成电路。对手将使用最小的密码猜测电路,他们可以在模具上,对应于最小的能耗和散热,并使他们尽可能多的并行。不同的成本参数对对手的实际成本有不同的影响。那么成本参数是做什么的呢?
    • 记忆。如果同时使用m对内存使用内存硬散列函数,则向对手提供一种选择:使密码猜测电路\Omega(m)倍于存储内存,或者使每个密码猜取(例如) \Omega(m^2)来重新计算未存储的内容。对手宁愿使用(比方说)双倍的空间在芯片上容纳两倍多的密码猜测电路;通过加倍内存需求,他们不能利用这种并行性。
    • 并行性。如果您同时使用p乘以CPU并行计算密码散列,则向对手提供一个选择:使密码猜测电路\Omega(p)倍于p并行,或者使每个密码猜测都以\Omega(p)为长。对手宁愿使用(比方说)双倍的空间来增加密码猜测的吞吐量;通过将并行性要求加倍,他们必须将并行性用于一个密码猜测,而不是并行中的两个密码猜测。
    • 迭代或时间。如果您使用t乘以迭代来计算具有相同内存和并行性的密码散列,则对手还必须在任何密码猜测电路上依次计算相同的迭代次数。因此,在任何特定的密码猜测机器上,无论对手使用多大的并行性或任何制造过程,其吞吐量都被t除以。

现代密码哈希支持使用合法用户可用的所有这些资源-内存、并行性和时间-以提高对手的成本。普通的SHA-256和HMAC (和HKDF)没有成本参数,它们或BLAKE2或SHA-3经常用作密码散列中的组件。PBKDF2只利用用户的时间,在具有固定内存的顺序CPU上--它不利用用户可用的任何额外CPU或用户计算机中的任何空闲内存。有比PBKDF2更好的设计: bcrypt比(比方说)PBKDF2-SHA 256使用更多的内存,但是内存是不可伸缩的;scrypt可以在内存和时间上进行缩放,但不能在并行性中扩展;并且像Argon2气球散列这样的新设计可以缩放内存、并行性和时间。

票数 4
EN

Cryptography用户

发布于 2019-08-30 10:04:26

重点不在于使攻击在时间上不可行。攻击所需的计算资源(通常是面积*时间,大致是货币成本的度量)是您唯一希望在这里增加的东西。

正如您所观察到的,对密码的蛮力搜索总是可以并行化的,所以最好的方法就是增加检查单个密码所需的计算量。当然,即使检查一个密码需要10秒,攻击者总是可以并行地放置数百万个ASIC,并在10秒内强行执行所有的操作。换句话说:对手总是可以用很少的时间获得密码,但这需要很大的面积(即同时使用的并行计算单元的数量)。从本质上讲,对手总是被迫投入大量的面积\times时间。

关键是这样做将花费大量的钱给对手:通常认为面积\times时间是一个不错的(粗略)的货币成本的攻击。所以我们的希望是让这次攻击在金钱上不那么有趣。

进一步的注意:数量面积\times时间实际上并不能很好地衡量货币成本,就像对现代ASIC的实验所显示的那样。然而,许多研究都致力于寻找更好的度量方法,使之更接近于货币成本(例如12)。有一堆令人满意的候选人,以及几个哈希函数的构造,可以证明最大限度地为对手这一措施。PBKDF2似乎并不是世界上最好的选择,但它是一种古老、成熟的替代方案,在实验上,它对对手带来的货币成本并没有表现得太差。

票数 3
EN

Cryptography用户

发布于 2019-08-30 22:00:42

像MD5、SHA-1、SHA-3这样的“正常”散列的主要目标是检查数据/文件的完整性。即使在大文件中使用时,它们也需要有效率。这就是为什么它们都被设计成尽可能高效(速度快,内存少)。

当您将这些算法应用于密码(通常很短,主要在20字节以下)时,这些优点显示了它们的缺点,它们使强制执行和并行计算变得容易。

密码派生或密码扩展散列函数有相反的目的。它们被设计成尽可能地消耗资源(使用大量的CPU和内存)。许多这样的算法,比如Argon2,都有影响CPU使用和内存使用的可配置参数。

“稍微慢一点.圈了一百万次”--这是个错误的说法。当您为单个用户计算一次时,用户可能甚至不会注意到任何差异。如果你强行要求10^15密码,两者之间的差别将是巨大的。如果你可以用一个正常的散列1年来强行使用密码,那么增加1 000 000次迭代就意味着你需要1 000 000年的时间,或者你需要1 000 000台计算机在1年内完成。这意味着你需要再多花1000,000元才能买到这些电脑。为了有效地使用CPU,野蛮强制通常在同一个CPU上使用多个线程。Argon2和类似的算法阻止了它的发生。如果您将哈希设置为每个散列使用10 PC或100 PC,那么特定PC上的RAM将限制线程数,攻击者将需要更多RAM (这很昂贵)和更多PC(因为线程数量将受到限制)。

你的措辞是:“PBKDF2怎么会比正常的哈希好得多?”对什么更好?对于密码的推导/拉伸,它们更好,但是对于文件完整性检查,像SHA-3这样的普通散列更好,非常明显。

票数 0
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/72918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档