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个字节。
我缺少什么(或者为什么我的期望不对?)?
- PBKDF2的一个主要功能,尤其是与它的前身现在改名为PBKDF1相比,其输出几乎可以是任何大小,尤其是大于基础哈希的输出。
-
@ dave_thompson_085我同意。但是我选择了PBKDF2WithHmacSHA256变体,所以我希望我总是从输出中得到SHA256(32字节)。似乎并非如此。为什么?
-
@MRalwasser:您说您同意,但是您忽略了" ...,尤其是大于基础哈希的输出"。
我们可以将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输出。
- 感谢您的解释,但我在您的回答中缺少SHA256部分,这是我的问题的关键组成部分。按照您的功能定义,看起来PBKDF2WithHmacSHA256可以作为SHA256(PBKDF2(..))的函数编写。这是真的吗?如果是,为什么输出长度不总是256位?
-
这意味着它使用HmacSHA256,并且hlen位大小为32个字节。现在,如果您要求更多,则dkLen PBKDF2将生成T2,T3 ...以产生所需长度的密钥,直到2^32 - 1 * hLen
-
那么在我的情况下,PRF是SHA256吗?
-
HMACSHA256是您的PRF。 HMAC使用SHA256。
-
谢谢,我不知道HMACSHA256函数实际上是PBKDF2的输入参数。我认为它可以处理PBKDF2的输出。谢谢!
-
我写了一个通用答案,以便可以用选择hlen的方式替换PRF。