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

时间:2019-10-22 16:52:57

标签: java cryptography sha pbkdf2

考虑以下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个字节,无论我使用的密钥大小如何。

我缺少什么(或者为什么我的期望错了?)

1 个答案:

答案 0 :(得分:1)

我们可以将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倍。

如您所见

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