关于java:PBKDF2WithHmacSHA256密钥长度对输出长度的影响

PBKDF2WithHmacSHA256 impact of key length to the output length

考虑以下Java代码:

1
2
3
4
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'是迭代次数

如何计算;

1
DK = T1 a€– T2 a€– ... a€– T_{dklen/hlen}

其中Ti = F(Password, Salt, c, i)且每个具有hlen大小。

1
F(Password, Salt, c, i) = U1 a?? U2 a?? ... a?? Uc

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

dkLen最多可以是后端哈希(PRF)输出大小的2 ^ 32-1倍。

如您所见,

,只需对32位编码值i的salt进行少量修改,PBKDF2就可以输出多个hlen输出。