我觉得我在这里问了一个相当明显的问题,但是在这个领域很容易犯错误,所以就这样吧。
来自维基百科:
DK = PBKDF2(PRF、密码、Salt、c、dkLen)
dkLen 是派生密钥的所需长度
我如何决定哪个是“所需长度”?
我觉得我在这里问了一个相当明显的问题,但是在这个领域很容易犯错误,所以就这样吧。
来自维基百科:
DK = PBKDF2(PRF、密码、Salt、c、dkLen)
dkLen 是派生密钥的所需长度
我如何决定哪个是“所需长度”?
PBKDF2 的输出长度是您所需要的。但有细节。
PBKDF2 是一个密钥派生函数:它产生一个可配置长度的字节序列,其预期目的是用作某些对称加密算法(或 MAC)的密钥。所以第一个反应是:如果你想使用一个对称加密算法,比如说,一个 19 字节的密钥,那么你需要 PBKDF2 中的 19 个字节。
现在了解详情:
PBKDF2 有一个缺点,即它按块生成数据,并且成本与您要求的块数成正比。例如,如果您使用带有 HMAC/SHA-1 的 PBKDF2 作为内部 PRF(这是通常的情况),那么您将获得 20 个块的字节。如果您想要 24 个字节,那么 PBKDF2 将需要生成两个块,这将是您想要 20 个字节或更少字节的两倍。
这是不幸的,因为 PBKDF2 故意很慢,以击败对密码的详尽搜索。但是,根据您使用 PBKDF2 输出的方式,攻击者可能只能在 PBKDF2 输出的第一个块上“测试”密码;实际上,这可能会给攻击者带来 x2 或 x3 的性能提升,但会适得其反。
建议的解决方法是使用 PBKDF2 生成一个输出块(例如 20 个字节),然后使用另一个快速 KDF 将这 20 个字节扩展为您需要的任意多个字节。HKDF是具有良好声誉的快速 KDF。
PBKDF2 经常被滥用到密码散列中。使用密码散列,您并没有真正使用输出,您只是将其存储起来以进行比较。对于这种用途,您需要存储足够多的字节,以免攻击者“走运”:找到与存储的内容匹配的输出应该是绝对不可能的。如果您使用 PBKDF2 进行密码散列,那么 12 字节的输出应该没问题,并且具有不可忽略的安全余量。
如果您将输出用于密码散列,则输出长度:
如果您将输出直接用作单个加密密钥:
如果您将输出同时用作加密密钥和 MAC,或者您将输出用于多个目的的任何其他情况:
“不超过本机散列的输出大小”的原因是RFC2898第 5.2 节,在 PBKDF2 定义中,指定如果请求的输出字节 (dkLen) 比本机散列函数提供的多,则为第一个本机哈希大小,然后是第二个完整的迭代计数,并继续直到您完成或您必须截断输出,因为您需要的剩余部分小于本机输出大小。