我有这段代码片段用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位生成在哪里?
答案 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)
dkLen is the desired length of the derived key
DK is the generated derived key
派生密钥hLen
的每个Ti
- 位块DK
的计算方法如下:
DK = T1 || T2 || ... || Tdklen/hlen
派生的字节数组可以是不基于散列算法的任意长度。