30

深入研究 java 加密和散列世界,我看到了类的构造函数示例,PBEKeySpec该类具有不同的值iterationCountkeyLength参数。似乎没有什么可以解释这些参数的影响或含义。

我假设这keyLength是密钥的长度,因此 32 位加密将采用 32 作为密钥长度的值,但这种假设感觉是错误的。我的猜测iterationCount是每个字符被加密的次数,同样也没有感受到这种假设的爱。

信息或解释的链接表示赞赏。

4

1 回答 1

45

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

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

密钥派生函数通常只输出“足够”的随机位,因此您仍然可以指定所需的密钥大小。


笔记:

  • 有关更多信息,请查看标准,PKCS 标准往往相对容易阅读。
  • 盐只需要独一无二;通常这是通过使用安全的随机数生成器(对于 Java 意味着使用new SecureRandom()然后nextBytes(int amount))创建 64 到 256 位的完全随机盐来实现的。盐可以是公开的,并与密文或密码哈希一起存储。
  • 为密钥大小指定任何大于散列输出大小(默认为 SHA-1,160 位输出大小)的值可能会失败(对于 PBKDF1)或导致额外的减速(对于 PBKDF2)。不建议; 只需在算法规范中使用 SHA-256、SHA-512 等哈希函数即可。
  • SHA-1(有时只是称为 SHA,因为 SHA-0 从未使用过)甚至MD5 对于这种功能仍然是完全安全的(因为它不依赖于抗碰撞性),但您仍然应该选择更安全的选项,例如作为新协议的 SHA-256 或 SHA-512。
于 2011-05-26T12:22:51.487 回答