java - SecretKeyFactory.generateSecret 在 IBM Java 上因 InvalidKeySpecException 终止

标签 java pbkdf2 java-security ibm-jdk

我们使用 PBKDF2 算法对密码进行哈希处理,使用 SecretKeyFactory.generateSecret函数,像这样:

final SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithm);
final PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, iterations, hashLength);
final SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
return secretKey.getEncoded();

一切似乎都工作正常,但是,在生产服务器上,当它在 IBM Java 中运行时,它会因 java.security.spec.InvalidKeySpecException: 无法生成 key :

而终止
Caused by: java.security.spec.InvalidKeySpecException: Could not generate secret key
    at javax.crypto.SecretKeyFactory.generateSecret(Unknown Source)
    at our.Implementation.doHash(Hasher.java:71)
    ... 48 more
Caused by: java.lang.RuntimeException: Error deriving PBKDF2 keys
    at com.ibm.crypto.provider.PBKDF2KeyImpl.a(Unknown Source)
    at com.ibm.crypto.provider.PBKDF2KeyImpl.<init>(Unknown Source)
    at com.ibm.crypto.provider.PBKDF2HmacSHA1Factory.engineGenerateSecret(Unknown Source)
    ... 50 more

我们尝试更改迭代计数、生成的哈希大小和盐大小,但没有任何帮助。我做错了什么?

最佳答案

显然,PBKDF2 的 IBM Java 实现似乎坚持密码不能为空。如果是这样,实现会抛出异常。

空密码可以说是一种边缘情况,但是,第一个测试用例正是如此,所以看起来代码根本不起作用。此外,虽然是一种边缘情况,但您要么需要确保它永远不会发生(验证要求用户不能使用空密码),要么您应该妥善处理它。

如果您确实需要支持空密码,您要么需要将它们作为特殊情况处理,要么只是规范化所有密码,以便 PBKDF2 的输入永远不会为空。但是,您必须确保不会以这种方式危及安全性。

最后,我们选择为所有密码添加长度前缀,这样即使是空密码也会以非空字符串表示。像这样:

final String prefixedPassword = String.format(Locale.ROOT, "%08x%s", password.length(), password);

关于java - SecretKeyFactory.generateSecret 在 IBM Java 上因 InvalidKeySpecException 终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43294652/

相关文章:

Java Keystore.getKey() 缓慢,同时 key 存储大小增加

objective-c - PBKDF2 在 iOS 上使用 CommonCrypto

java - 通过 RMI 发送 javax.security.auth.Subject 对象时遇到 NullPointerException

java - "PKIX path building failed: unable to find valid certification path to requested target"仅在发布版本中

java - 使 Android 应用程序在一个 session 中连接

java - Java高CPU线程| JBOSS EAP 6.3 |无法找到根本原因

java - 通过命令提示问题进行Java编译

JavaFx 希腊字符编码

javascript - PBKDF2 Java 脚本实现与 Apache 许可证