java - PBKDF2WithHmacSHA256 key 长度对输出长度的影响

标签 java cryptography sha pbkdf2

考虑以下 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/

相关文章:

iOS 应用程序存在加密提交问题

java - 对于这种情况,如何在 hibernate 中定义唯一约束?

Java:找不到符号:变量对象

security - 使用密码和种子进行加密时哪种过程更安全

java - 来自 Java 的 Ruby 中的 HMAC

c# - Securepay 支付网关集成问题

java - SHA 256 从 Java 到 C#

java - 如何使用 ShaPasswordEncoder 正确编码密码?

java - 如何调试已安装的 eclipse 插件

java - 线路问题拆分