密码散列方案(例如PHC赢家Argon2)用于散列通常具有低熵的密码,目的是使散列摘要反转对于CPU和CPU的对手而言尽可能地昂贵。内存消耗以及并行化。
是否确实要考虑密码哈希方案实际上是专用于低熵输入的键派生函数?还是这两种类型的密码方案在理论性质上还有其他本质上的区别吗?
#1 楼
密钥派生函数可以完成以下操作:将具有最小最小熵*的初始密钥材料的随机位字符串转换为有效统一的随机位字符串。
标签
防止多目标攻击在使用可选的盐攻击$ n $目标之一时节省$ n $的成本。
通常,部分(1)和(3)与部分(2)分别以提取/展开形式完成,例如$ \ operatorname {HKDF-Extract}(\ mathit {salt},\ mathit {ikm})$会将高最小熵的初始密钥材料$ \ mathit {ikm} $转换为有效统一的随机主密钥$ \ mathit {prk} $,并带有可选的盐和$ \ operatorname {HKDF-Expand} (\ mathit {prk},\ mathit {info},\ mathit {noctets})$,它有效地从统一的随机主密钥$ \ mathit {prk} $中派生,这些子密钥由$ \ mathit {info} $参数标记。如果您已经有一个统一的随机主密钥可以启动,则可以跳过HKDF-Extract并将其直接传递给HKDF-Expand。 />
需要花费大量的时间,内存和并行性进行评估。
通过这种方式,即使我们无法控制预期的密码猜测次数,也可以控制每个猜测的测试成本,以提高预期的找到密码的成本。
具体来说,密码哈希通常构成(1),(3)和(4)部分,并保留可重复标记将(2)中的子键派生为类似HKDF-Expand的功能。例如,实际上使用PBKDF2生成一个以上的输出块可能会很痛苦,因此您绝对应该使用HKDF-Expand将PBKDF2的单个主键转换为许多子键。就是说,这种特殊的病理已在Argon2中修复,但是HKDF-Expand仍可能更方便地按目的标记子项。
摘要:
如果您具有较高的最小熵秘密(如Diffie-Hellman共享密钥),则请使用HKDF-Extract。
如果您具有较低的最小熵秘密(如密码),请使用Argon2。
然后将生成的有效统一主密钥通过HKDF-Expand传递出去,以导出用于标记目的的子密钥。
*用于生成密钥的过程的最小熵选择是衡量任何结果可能性最高的方法;具体来说,如果在某个过程选择的(例如)密码的有限空间中,$ i ^ {\ mathit {th}} $密码的概率为$ p_i $,则该过程的最小熵为$-\ max_i \ log_2 p_i $位。如果存在从$ n $个选项中随机选择一致的过程,则此过程的最小熵就是$ \ log_2 n $。例如,具有10个单词的diceware过程具有$ \ log_2 7776 ^ {10} \约129.2 $位的最小熵。
评论
$ \ begingroup $
因此,您从本质上回答了“是”。也就是说,如果您查看HKDF和Argon2的各自设计,则前者在提取步骤中需要PRF,而后者则具有哈希函数。因此,很明显,两种设计中的提取阶段似乎都没有针对相同的安全要求。在PHC期间,这还没有引起我的注意。
$ \ endgroup $
– cryptopathe
19年5月21日在16:53
$ \ begingroup $
让我感到困惑的另一点是,该答案建议仅将Argon2用作低最小熵提取器,而不用作扩展器,尽管Argon2提供了生成所需数量的输出字节的可能性。
$ \ endgroup $
– cryptopathe
19年5月21日在16:59
$ \ begingroup $
HKDF提取不仅仅依赖于PRF安全性(例如HMAC-SHA256),因为两种输入(盐,IKM)都不必均匀分布; HKDF扩展仅依赖PRF安全性。是的,您可以使用Argon2生成所需的任意数量的输出字节,但是它并没有为单独的步骤提供用于快速可重现子键派生的便捷标记。
$ \ endgroup $
–吱吱作响的s骨
19年5月21日在17:01
$ \ begingroup $
您的第一句话是令人误解的:HKDF论文(引理2)证明了PRF是足够好的随机抽取器,因此说一个人需要“不仅仅是PRF安全性”是不正确的,因为PRF安全性就足够了,但也许没有必要。
$ \ endgroup $
– cryptopathe
19年5月21日在17:11
$ \ begingroup $
PRF可以用作随机性提取器,但这不足以证明例如HKDF-Extract(salt,DH(...))的安全性,其中既不输入,也不是唯一的盐, DH秘密不一致-均匀分布,因此没有任何输入满足PRF密钥的标准。
$ \ endgroup $
–吱吱作响的s骨
19年5月21日在17:13
#2 楼
密钥拉伸密钥派生函数必须产生具有一定随机性的结果,并且很难逆转。密码散列只需要满足“难于反向”的属性,而无需随机性要求。这就是为什么所有键拉伸键派生函数都用作密码散列,而不是相反的原因。请注意,还有一些键拉伸派生函数也是非拉伸的。扩展功能本来就很慢,这对于密码哈希是必需的。当输入的熵较低时(例如密码),无论目标是导出密钥材料还是密码哈希,都不适用于HKDF之类的快速键派生功能。
评论
$ \ begingroup $
这完全是倒退。 KDF和密码散列都具有随机性和不可逆性要求。密码散列(有时称为基于密码的KDF)还具有一些参数,可以衡量评估它们的成本。
$ \ endgroup $
–吱吱作响的s骨
19年5月24日在16:01
$ \ begingroup $
@SqueamishOssifrage在此答案中,“ KDF”的意思是“可以拉伸的KDF”,因为它最初是写在另一个仅涉及密钥拉伸KDF的问题上的。合并很不幸,因为需要重写此答案以匹配较新的问题。
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
20-10-2在21:46
评论
有两种KDF,一种是由密码(例如PBKDF2)提供的慢速,加强类型,另一种是仅从主密钥(例如HMAC)派生辅助密钥的快速KDF。第二个显然不应该用于密码哈希。是的,我实际上知道这一点。我澄清了这个问题。
我相信此评论可以回答您的问题。