在阅读了这两个资源之后,我想知道我是否得到了Scrypt和PBKDF2之间的所有区别。据我了解,相似之处是:


是基于密码的密钥派生函数。

区别是:


Scrypt对资源的要求更高。

我缺少什么吗? ?

评论

另请参阅在信息安全方面bcrypt是否比scrypt好?

#1 楼

PBKDF2和scrypt都是密钥派生函数(KDF),它们通过故意降低计算速度,特别是通过具有可调整的参数来控制慢度来实现密钥扩展。

区别在于scrypt是还设计为需要大量(且可调整)的内存才能有效地进行计算。这样做的目的是使使用GPGPU或自定义ASIC / FPGA硬件之类的设备很难使其并行化。
这类设备可能具有数百甚至数千个并行处理单元,每个处理单元都可以使用传统的KDF散列不同的密码。例如PBKDF2,不需要太多内存。但是,事实证明,至少使用当前的技术,为这些并行单元中的每一个提供大量的存储空间比制造这些单元本身要困难得多且昂贵得多。


PBKDF2和scrypt之间的另一个区别是PBKDF2是用于转换任何加密哈希函数的通用构造(实际上是伪随机函数,但是获得PBKDF2的PRF的最常见方法是使用HMAC构造从哈希函数中构造一个)转换为密钥拉伸KDF。因此,您实际使用的KDF可能是PDFKD2-HMAC-SHA256,表示基于SHA-256哈希函数构建的HMAC的PBKDF2。另一方面,Scrypt是一种特定的密钥派生函数,其中“内部没有用户可替换的部件” 。尽管scrypt确实使用了一些标准功能和结构(实际上,它内部使用PBKDF2-HMAC-SHA256进行状态扩展和压缩阶段),但scrypt规范并未对将哈希函数更改为SHA-256以外的其他内容。这是“接受或放弃”交易。

也就是说,原则上可以使用scrypt论文中描述的原理定义一个新的KDF,但是要使用不同的组件。特别是,scrypt论文将scrypt定义为一种称为MFcrypt的更通用的构造的实例,该构造使用HMAC-SHA256和内存硬混合函数SMix(也在本文中进行了定义)实例化。可以使用带有SHA-3而不是SHA-256的MFcrypt实例,但是该函数将不再是本文中定义的“ scrypt”。

评论


$ \ begingroup $
我仍然不确定什么更糟:NIST接受各种KDF,而没有指定默认构造和原语,或者这类直接指定要使用的原语的论文(scrypt)。
$ \ endgroup $
–马腾·博德威斯♦
2014年8月4日在8:10



#2 楼

如本文第2节所述,Scrypt更依赖于“内存硬算法”。

PBKDF2通过增加迭代而更多地依赖于增加CPU需求。

这里很好地概括了如何解释像bcrypt / scrypt之类的KDF的工作原理。另请查看此说明以获取更多详细信息。