[英]java hash from “PBKDF2WithHmacSHA512” is differs from python CRYPT(digest_alg='pbkdf2(1000,20,sha512)', salt=True)(password)[0])
[英]PBKDF2 - What happens when generating 1024 bits key length with SHA512?
我有此代码段以使用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位在哪里生成?
通常,不建议要求超过散列长度,因为每个块都会在所有迭代中再次运行:
根据Wikipedia(其格式比PKCS#5更具可读性):
DK = T1 || T2 || ... || Tdklen/hlen Ti = F(Password, Salt, c, i)
这里c
是迭代计数。
这样做的问题是, 通常仅在将结果分为多个部分时才使用大量密钥材料。 而且,如果攻击者仅使用前128位(例如,前128位)就可以验证一个很好的密码猜测,那么与该算法的合法用户相比,攻击者所要做的工作就更少。
解决此问题的一种方法是使用KBK(例如HKDF)使用不同的标签(信息也经过哈希处理)拆分PBKDF2的输出。 这样,您可以生成几乎无限数量的密钥材料,而无需为每个512位进行所有迭代。
请注意,对于两个非常安全的AES-256位密钥,512位就足够了。 因此,这是将SHA-512用于PBKDF2的一个很好的理由。 请注意,在64位计算机上,SHA-512可能比SHA-256 快,同时提供更多的输出资料和安全性。
每个PBKDF2
dkLen is the desired length of the derived key
DK is the generated derived key
派生密钥DK
每个hLen
位块Ti
的计算如下:
DK = T1 || T2 || ... || Tdklen/hlen
派生的字节数组可以是不基于哈希算法的任意长度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.