PBKDF2 - 使用 SHA512 生成 1024 位密钥长度时会发生什么?

PBKDF2 - What happens when generating 1024 bits key length with SHA512?

我有这段代码可以用 PBKDF2 生成密钥。

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
        PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), iterations, length);
        SecretKey key = skf.generateSecret(spec);
        byte[] res = key.getEncoded();

我想知道当密钥长度超过指定的 SHA 摘要算法类型时如何生成?

例如 - 当我将密钥长度设置为 1024 位并使用 PBKDF2WithHmacSHA512 算法时会发生什么情况? 512位是从哪里产生的?

PBKDF2

dkLen is the desired length of the derived key
DK is the generated derived key

派生密钥 DK 的每个 hLen 位块 Ti 计算如下:

DK = T1 || T2 || ... || Tdklen/hlen

导出的字节数组可以是任意长度,不基于哈希算法。

一般情况下,不建议要求超过哈希长度,因为每个块再次 运行 通过所有迭代:

根据维基百科(其格式比 PKCS#5 更具可读性):

DK = T1 || T2 || ... || Tdklen/hlen
Ti = F(Password, Salt, c, i)

这里c顺便说一下迭代次数

问题在于 通常 大量键 material 仅在结果拆分为多个组件时使用。如果攻击者可以仅使用前 128 位来验证正确的密码猜测,那么攻击者所要做的工作要比算法的合法用户少。

解决这个问题的一种方法是使用 KBKDF 拆分 PBKDF2 的输出,例如 HKDF 使用不同的标签(也被散列的信息)。这样你就可以生成几乎无限数量的密钥 material 而无需 运行 对每 512 位进行所有迭代。

请注意,512 位足以用于两个 非常 安全的 AES-256 位密钥。所以这是对 PBKDF2 使用 SHA-512 的一个很好的理由。请注意,在 64 位计算机上,SHA-512 可能比 SHA-256 更快,同时提供更多输出 material 和安全性。