我不知道密钥长度扩展攻击是如何工作的。所以,如果我们把这一次放在一边,说一下通常对散列的野蛮攻击,我真的不知道为什么PBKDF2比通常的散列要好得多。
从数学上讲,我知道PBKDF2能够更好地抵御彩虹表攻击,而且重建速度也很慢,但是随着计算能力在世界上的不断提高,它如何保持其完整性呢?
对于HMAC,我们使用salt,对于通常的散列,我们也可以这样做。
所以,SHA256('Hello'),很容易被彩虹摆在桌面上。因此,如果我添加了一个salt,它会更好一些,比如SHA256(salt+msg),但是salt通常以明文的形式保存在DB中,所以如果一些黑客能够破解该盐,他可以手动添加salt并执行相同的操作。
现在在HMAC中,-> H( key (opad) + h(salt +key))在数学上是安全的,但通过运行HMAC操作(如果他知道salt),可以很容易地强行强制所有可能的密码,并得到密钥。稍微慢一点,但有可能,在pbkdf2中,整个过程甚至被循环了一百万次,而且数学上的复杂性也很高,但是,如果你得到盐的话。他可以通过另一个pbkdf2函数运行一大串密码,可能非常慢,但仍然有可能,对吧?
发布于 2019-08-30 15:06:44
现代密码哈希支持使用合法用户可用的所有这些资源-内存、并行性和时间-以提高对手的成本。普通的SHA-256和HMAC (和HKDF)没有成本参数,它们或BLAKE2或SHA-3经常用作密码散列中的组件。PBKDF2只利用用户的时间,在具有固定内存的顺序CPU上--它不利用用户可用的任何额外CPU或用户计算机中的任何空闲内存。有比PBKDF2更好的设计: bcrypt比(比方说)PBKDF2-SHA 256使用更多的内存,但是内存是不可伸缩的;scrypt可以在内存和时间上进行缩放,但不能在并行性中扩展;并且像Argon2和气球散列这样的新设计可以缩放内存、并行性和时间。
发布于 2019-08-30 10:04:26
重点不在于使攻击在时间上不可行。攻击所需的计算资源(通常是面积*时间,大致是货币成本的度量)是您唯一希望在这里增加的东西。
正如您所观察到的,对密码的蛮力搜索总是可以并行化的,所以最好的方法就是增加检查单个密码所需的计算量。当然,即使检查一个密码需要10秒,攻击者总是可以并行地放置数百万个ASIC,并在10秒内强行执行所有的操作。换句话说:对手总是可以用很少的时间获得密码,但这需要很大的面积(即同时使用的并行计算单元的数量)。从本质上讲,对手总是被迫投入大量的面积\times时间。
关键是这样做将花费大量的钱给对手:通常认为面积\times时间是一个不错的(粗略)的货币成本的攻击。所以我们的希望是让这次攻击在金钱上不那么有趣。
进一步的注意:数量面积\times时间实际上并不能很好地衡量货币成本,就像对现代ASIC的实验所显示的那样。然而,许多研究都致力于寻找更好的度量方法,使之更接近于货币成本(例如1、2)。有一堆令人满意的候选人,以及几个哈希函数的构造,可以证明最大限度地为对手这一措施。PBKDF2似乎并不是世界上最好的选择,但它是一种古老、成熟的替代方案,在实验上,它对对手带来的货币成本并没有表现得太差。
发布于 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这样的普通散列更好,非常明显。
https://crypto.stackexchange.com/questions/72918
复制相似问题