【问题标题】:PBEKeySpec what do the iterationCount and keyLength parameters influence?PBEKeySpec iterationCount 和 keyLength 参数有什么影响?
【发布时间】:2011-09-01 20:01:59
【问题描述】:
深入研究 java 加密和散列世界,我看到了 PBEKeySpec 类的构造函数示例,其中 iterationCount 和 keyLength 参数的值各不相同。似乎没有什么可以解释这些参数的影响或含义。
我假设keyLength 是密钥的长度,因此 32 位加密的密钥长度值为 32,但这种假设感觉是错误的。我对iterationCount 的猜测是每个字符被加密的次数,同样也没有感受到这种假设的爱。
感谢提供信息或解释的链接。
【问题讨论】:
标签:
java
encryption
cryptography
pbkdf2
kdf
【解决方案1】:
迭代计数是在推导对称密钥期间密码被散列的次数。数字越大,验证密码猜测然后导出正确密钥的难度就越大。它与用于防止使用彩虹表的攻击的盐一起使用。迭代计数应该尽可能高,而不会使您自己的系统速度过慢。迭代计数的更通用术语是工作因子。
密钥长度是派生对称密钥的长度位。 DESede 密钥的长度可以是 128 位或 192 位,包括奇偶校验位。 AES 密钥的长度可以是 128、192 或 256 位。问题是 API 没有指定密钥长度(位/字节,有或无奇偶校验)的含义;对于PBEKeySpec,密钥大小为位,包括本节所示的奇偶校验位。
密钥派生函数通常只输出“足够”的随机位,因此您仍然可以指定所需的密钥大小。
注意事项:
- 有关更多信息,请查看the standard,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。