PBKDF2WithHmacSHA256 密钥长度对输出长度的影响

PBKDF2WithHmacSHA256 impact of key length to the output length

考虑以下 java 代码:

KeySpec spec = new PBEKeySpec("pass".toCharArray(), "salt".getBytes(),
    10000, 512);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
System.out.println(f.generateSecret(spec).getEncoded().length);

这段代码输出“64”。所以 64 字节,而 SHA-256 是 32 字节哈希。

我知道我指定了 512 位(64 字节)作为密钥长度。
但是我 期望 生成的密钥 (PBKDF2) 将由 SHA-256 进行哈希处理,因此 输出应始终为 32 字节,无论我使用的密钥大小如何。

我错过了什么(或者为什么我的期望是错误的)?

我们可以把PBKDF写成DK = PBKDF2(PRF, Password, Salt, c, dkLen)

  • PRF 是输出长度为 hlen
  • 的伪随机函数
  • dkLen 是派生密钥的所需位长
  • 'c'为迭代次数

如何计算;

DK = T1 ‖ T2 ‖ ... ‖ T_{dklen/hlen}

其中 Ti = F(Password, Salt, c, i) 每个都有 hlen 尺寸。

F(Password, Salt, c, i) = U1 ⊕ U2 ⊕ ... ⊕ Uc

U1 = PRF(Password, Salt + INT_32_BE(i))
U2 = PRF(Password, U1)
...
Uc = PRF(Password, Uc-1)

dklen 最多可以是后端散列 (PRF) 输出大小的 2^32 - 1 倍。

如您所见,对 salt 的 32 位编码值 i 进行少量修改,PBKDF2 可以输出多个 hlen 输出。