【发布时间】:2020-02-18 21:11:38
【问题描述】:
考虑下面的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 字节,无论我使用什么密钥大小。
我缺少什么(或者为什么我的期望是错误的)?
【问题讨论】:
-
PBKDF2 的一个主要特点,尤其是与现在改名为 PBKDF1 的前身相比,它的输出几乎可以是任意大小,尤其是大于底层哈希的输出。
-
@dave_thompson_085 我同意。但是我选择了 PBKDF2WithHmacSHA256 变体,所以我希望我总是从输出中得到一个 SHA256(32 字节)。情况似乎并非如此。为什么?
-
@MRalwasser:你说你同意,但你忽略了“......尤其是大于底层哈希的输出”。
标签: java cryptography sha pbkdf2