考虑以下 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 字节)作为 key 长度。
但是我期望生成的 key
(PBKDF2) 将通过 SHA-256 进行哈希处理,以便输出应始终为 32 字节,无论我使用什么 key 大小。
我缺少什么(或者为什么我的期望是错误的)?
最佳答案
我们可以将 PBKDF 写为 DK = PBKDF2(PRF, Password, Salt, c, dkLen)
PRF
是伪随机函数,输出长度为hlen
dkLen
是派生 key 所需的位长度- '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 倍。
如您所见,只需对 i
32 位编码值的 salt 进行少量修改,PBKDF2 就可以输出多个 hlen
输出。
关于java - PBKDF2WithHmacSHA256 key 长度对输出长度的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58508998/