深入研究 java 加密和哈希世界,我看到了构造函数的示例PBEKeySpec
具有不同值的类iterationCount
和keyLength
参数。似乎没有什么可以解释这些参数的影响或含义。
我假设keyLength
是密钥的长度,因此 32 位加密将采用 32 作为密钥长度,但这种假设感觉是错误的。我的猜测是iterationCount
是每个字符被加密的次数,同样也没有感受到对这个假设的喜爱。
感谢信息或解释的链接。
迭代计数是在派生对称密钥期间对密码进行哈希处理的次数。数字越大,验证密码猜测并得出正确密钥的难度就越大。它与盐一起使用,盐用于防止使用彩虹表的攻击。迭代计数应该尽可能高,而不会使您自己的系统速度减慢太多。迭代计数的更通用术语是工作因素.
密钥长度就是长度in bits派生的对称密钥。 DESede 密钥的长度可以是 128 或 192 位,包括奇偶校验位。 AES 密钥的长度可以是 128、192 或 256 位。问题是 API 没有指定密钥长度(位/字节,带或不带奇偶校验);为了PBEKeySpec
密钥大小为位,包括本节中所示的奇偶校验位。
密钥派生函数通常只输出“足够”的随机位,因此您仍然可以指定所需的密钥大小。
Notes:
- 欲了解更多信息,请查看标准 https://www.rfc-editor.org/rfc/rfc2898, PKCS 标准往往相对容易阅读。
- 盐只需是唯一的即可;通常,这是通过使用安全随机数生成器创建 64 至 256 位完全随机盐来实现的(对于 Java 来说,这意味着使用
new SecureRandom()
进而nextBytes(int amount)
)。盐可以是公开的并与密文或密码哈希一起存储。
- 为密钥大小指定任何大于哈希输出大小(默认情况下为 SHA-1,160 位输出大小)的值可能会失败(对于 PBKDF1)或导致额外的速度减慢(对于 PBKDF2)。不建议;只需使用算法规范中的 SHA-256、SHA-512 等哈希函数即可。
- SHA-1(有时简称 SHA,因为从未使用过 SHA-0)和evenMD5 对于此类功能仍然是完全安全的(因为它不依赖于碰撞抵抗),但您仍然应该为新协议选择更安全的选项,例如 SHA-256 或 SHA-512。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)