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

问题描述 投票:0回答:1

考虑以下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个字节,而不管我使用的密钥大小。

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

java cryptography sha pbkdf2
1个回答
0
投票

我们可以将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, where ^ is x-or

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

dklen最多为后端哈希输出大小的2 ^ 32-1倍。

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

© www.soinside.com 2019 - 2024. All rights reserved.