PBEKeySpec对iterationCount和keyLength参数有何影响?

Mar*_*ark 19 java encryption cryptography pbkdf2 kdf

深入研究java加密和散列世界,我看到了PBEKeySpec类的构造函数的示例,其中包含各种值iterationCountkeyLength参数.似乎没有什么能解释这些参数的影响或意义.

我假设keyLength密钥是多长时间,因此密钥长度的32位加密值为32,但这种假设感觉不对.我的猜测iterationCount是每个字符加密的次数,也不再感受到对这个假设的喜爱.

欢迎链接到信息或解释.

Maa*_*wes 33

迭代计数是在派生对称密钥期间密码被散列的次数.数字越大,验证密码猜测越困难,然后导出正确的密钥.它与盐一起使用,用于防止使用彩虹表进行攻击.迭代计数应该尽可能高,而不会过度减慢自己的系统速度.迭代计数的更通用术语是工作因素.

密钥长度是派生的对称密钥的长度.DESede密钥可以是128或192位长,包括奇偶校验位.AES密钥长度可以是128,192或256位.问题是API没有指定密钥长度(比特/字节,有或没有奇偶校验); 为PBEKeySpec密钥大小是位,包括如本节中示出的奇偶校验位.

密钥派生函数通常只输出"足够"的随机位,这就是为什么你仍然可以指定所需的密钥大小.


笔记:

  • 有关详细信息,请查看标准,PKCS标准往往相对容易阅读.
  • 盐只需要是独一无二的; 通常,这是通过使用安全随机数生成器创建64到256位完全随机盐来实现的(对于Java意味着使用new SecureRandom()然后nextBytes(int amount)).salt可以是公共的,并使用密文或密码哈希存储.
  • 为密钥大小指定大于哈希输出大小的任何值(默认情况下,这是SHA-1,160位输出大小)可能会失败(对于PBKDF1)或导致额外减速(对于PBKDF2).不建议; 只需在算法规范中使用哈希函数,如SHA-256,SHA-512.
  • SHA-1(有时也称为SHA,因为SHA-0从未使用过),甚至 MD5对于这种功能仍然是完全安全的(因为它不依赖于抗冲击性)但是你仍然应该寻求更安全的选择,例如用作新协议的SHA-256或SHA-512.

  • 使用 PKBDF2-SHA256 时推荐的迭代次数:https://security.stackexchange.com/questions/3959/recommended-of-iterations-when-using-pkbdf2-sha256 (2认同)