#1 楼
HKDF论文提供了以下任何方面的摘要:密钥派生函数(KDF)是密码系统的基本和必不可少的组成部分:其目标是获取初始密钥源一种材料,通常包含一定数量的随机性,但分布不均匀,或者攻击者对此具有部分知识,并从中衍生出一个或多个具有加密强度的秘密密钥。
重要的是要了解概率理论中术语“随机”的使用方式,以及计算机人员如何(滥用)该术语。非正式地讲:
当我们的计算机人员说“随机”时,我们经常不是隐式地假设我们在谈论离散,有限,统一和独立的随机变量,即从有限集抽取的任何值都具有与所有其他值相同的概率,并且较早的结果不会影响较晚的结果,即硬币翻转或掷骰子的行为方式。
当统计学家说随机时,他们并没有那么假设。例如,对于统计学家来说,刻板印象的随机变量具有正态分布(“钟形曲线”),其中值聚集在平均值附近,并根据标准偏差分散(例如,不精确的物理测量具有随机误差,
因此,请记住这句话,KDF是一种密码学上很强大的函数,它接受统计学家意义上为随机的输入,并产生出密码学家()为伪随机的输出(首选)的意义。这在各种情况下很有用:用随机选择的密钥进行Diffie-Hellman密钥交换会产生一个共享的秘密,这在统计学家的意义上是随机的,但是其输出不是均匀分布的。因此,要将这个秘密用作对称密钥,您可以通过一些KDF传递它。
密码随机数生成器会定期从通过测量随机事件(例如网络数据包定时,鼠标移动或按键)获得的值中刷新自身。这些也不是统一的,因此可以使用KDF来解决。
密码也不是统一的,因此要使用KDF将密码转换为密钥。但是在那种情况下,我们使用基于密码的专用KDF,这些KDF还添加了一个工作因素来减缓暴力猜测的可能性。
#2 楼
KDF或密钥派生功能是从其他秘密信息(输入密钥材料(IKM))派生密钥或输出密钥材料(OKM)的功能或方案。该信息可以是另一个密钥,或者例如是密码。重要的是,机密必须具有足够的随机性来生成密钥,而没有攻击者能够使用有关输入的信息来进行攻击。KDF具有以下可能的用例:
从给定的IKM中提取熵;
将提取的熵扩展到适当大小的OKM;
加强IKM,例如密码(如果是基于密码的KDF或PBKDF);
从单个IKM单向生成多个OKM。
KDF的形式很多,但并非所有功能都用作KDF。被明确命名为KDF。例如,对于伪随机函数,TLS的KDF简称为“ PRF”,这是一个更为通用的术语。
某些KDF具有输入限制,有些具有输出限制,但并非全部KDF的配置参数相同。
KDF的基本结构是:
输入:
二进制编码的密码或键;
用于导出特定键的其他信息(可选);
输出大小(如果可配置)。
输出:
此外,还有许多不同的参数可能:
盐;
工作因数(对于PBKDF) ;
内存使用(对于PBKDF);
并行性(对于PBKDF)。
编程接口的输出还可以包含其他配置或输入参数,例如输出键的属性。例如,逻辑上还包括密钥的类型,例如“ AES”,以便可以将OKF存储在用于AES密钥的容器中。
现在,KDF的想法是这是一种方法,并且输出与随机数是无法区分的。如果输入材料包含一定数量的随机性,则应该很难用力破解输入键材料。因此,KDF通常是从单向散列或PRF(例如消息身份验证代码(MAC算法))构建的。此外,KDF应该是确定性的。这意味着KDF本身也是PRF。
最后,用例:
它们被用作“密码哈希” ,它执行IKF的增强以创建OKF:可以存储在数据库中的密码哈希(以防止实际的密码由获取数据库副本的攻击者计算);
它们被使用来“集中” IKM的熵,例如Diffie-Hellman密钥交换的输出不是100%均匀分布;
它们被用来从同一IKM派生多个(可能长度/类型可能不同)密钥通过为每个密钥指定特定的信息参数;
它们用于扩展密钥材料,同时保持IKM的安全性。
作为最后一点的示例,您可以通过拆分输出OKM,从单个128位源密钥中将192位三重DES密钥和IV检索为IKM。
如所示,KDF的类型和结构很多。一方面,有基于块密码的KDF,它需要特定的密钥大小并精确地输出一个块大小的密钥材料。另一方面,HKDF(可能是目前最先进的KDF)可以在任何输入大小上工作,并且具有较大的输出大小。
基本上有两个KDF系列。已经提到的PBKDF(例如PBKDF1,PBKDF2,bcrypt,scrypt和Argon2)采用需要增强的密码作为输入密钥材料,然后执行增强。 KBKDF的-基于密钥的密钥派生函数-将已经包含足够熵的密钥材料作为输入。
评论
$ \ begingroup $
对于上段中的PBKDF,您能更明确地说明加强吗?我的理解是,此处要解决的有关密码的问题是其熵不足,而不是不均匀。这是否意味着在这种情况下必须使用随机生成的盐(以提供额外的熵)?如果我们只是希望输出密钥材料像密码一样安全(即使它没有足够的熵来限定密码密钥),该怎么办?我们可以简单地使用恒定盐还是不使用盐?
$ \ endgroup $
– Cyker
18年7月14日在6:15
$ \ begingroup $
@Cyker不,要避免将导出的密钥材料与Rainbow表进行比较。它不会仅仅因为所有人都知道该盐而增加了熵(如果使用了一种秘密盐,也称为胡椒粉,但是它要求您具有预先确定的密钥)。基本上,增强只是每个密码哈希需要执行的工作量。这减慢了攻击者尝试对密码进行字典攻击的速度,但同时也减慢了普通用户的速度。而且它只会使攻击减慢一定的速度。
$ \ endgroup $
–马腾·博德威斯♦
18年7月14日在10:34
评论
...嗯,从秘密中获取密钥?KDF的常见用法是获取人类可读的文本密码,并将其转换为比特和字节,以用作密码算法的密钥。 Maarten在下面描述了基于密码的密钥派生功能。 KDF意味着人类不必记住用于AES-256密钥的准确的32字节十六进制密码,或用于DES密钥的8字节十六进制密码。