考虑以下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个字节,无论我使用的密钥大小如何。
我缺少什么(或者为什么我的期望错了?)
答案 0 :(得分:1)
我们可以将PBKDF编写为DK = PBKDF2(PRF, Password, Salt, c, dkLen)
PRF
是伪随机函数,输出长度为hlen
dkLen
是派生密钥的所需位长计算方式;
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
输出。