PBKDF2 - 使用SHA512生成1024位密钥长度会发生什么?

时间:2017-06-06 18:07:51

标签: java cryptography pbkdf2 secret-key

我有这段代码片段用PBKDF2生成密钥。

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
        PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), iterations, length);
        SecretKey key = skf.generateSecret(spec);
        byte[] res = key.getEncoded();

我想知道当密钥长度超过指定的SHA摘要算法类型时生成是如何工作的?

例如 - 当我设置1024位密钥长度并使用PBKDF2WithHmacSHA512算法时会发生什么? 512位生成在哪里?

2 个答案:

答案 0 :(得分:3)

一般情况下,建议不要再要求散列长度,因为每个块都会再次运行所有迭代:

根据维基百科(其格式比PKCS#5更易读):

DK = T1 || T2 || ... || Tdklen/hlen
Ti = F(Password, Salt, c, i)

这里c是迭代次数。

这个问题是一般大量的密钥材料仅在结果被分成多个组件时使用。如果攻击者只能使用 - 比如说 - 前128位来验证一个好的密码猜测,那么攻击者必须比算法的合法用户做更少的工作。

解决此问题的一种方法是使用KBKDF(例如HKDF)使用不同的标签(也是经过哈希处理的信息)来分割PBKDF2的输出。这样,您可以生成几乎无限量的密钥材料,而无需遍历每512位的所有迭代。

请注意,对于两个非常安全的AES-256位密钥,512位就足够了。因此,将SHA-512用于PBKDF2是一个非常好的理由。请注意,在64位计算机上,SHA-512可能比SHA-256 更快,同时提供更多输出材料和安全性。

答案 1 :(得分:2)

PBKDF2

dkLen is the desired length of the derived key
DK is the generated derived key

派生密钥hLen的每个Ti - 位块DK的计算方法如下:

DK = T1 || T2 || ... || Tdklen/hlen

派生的字节数组可以是不基于散列算法的任意长度。