PBKDF2WithHmacSHA512 SecretKeyFactory不可用。

3

这是一个非常奇怪的错误。在两台电脑上,代码运行得很好。我刚刚在一台全新的机器上设置了它,但是不起作用。运行脚本时我收到以下错误消息:

java.lang.RuntimeException: java.security.NoSuchAlgorithmException: PBKDF2WithHmacSHA512 SecretKeyFactory not available

导致错误的代码行是:
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance( "PBKDF2WithHmacSHA512" );

使用JDK 1.7.0
代码编译都正确,但是在运行时却出错了。我感觉这可能与不同的JAR文件或略有不同的JDK有关,但是在检查了不同机器上的所有内容后,发现一切看起来都一样。
你有什么想法吗?
3个回答

6
Java 8 增加了对 PBKDF2WithHmacSHA512 的支持,但默认情况下 Java 7 不支持(Java 7 本身仅支持 PBKDF2WithHmacSHA1)。
比较:
- Java 7 中的 SecretKeyFactory 算法 PBKDF2WithHmacSHA1:使用 PKCS #5 v2.0 中发现的基于密码的密钥派生函数构建密钥。
- Java 8 中的 SecretKeyFactory 算法 PBKDF2With<prf>:使用指定的伪随机函数(<prf>)在 PKCS #5 2.0 中发现的基于密码的密钥派生算法。例如:PBKDF2WithHmacSHA256。
因此,您需要升级到 Java 8,或降级到 PBKDF2WithHmacSHA1,或检查是否存在为 Java 7 提供 PBKDF2WithHmacSHA512 的 JCE 提供程序(例如 Bouncy Castle)。
如果您的代码在另一台带有 Java 7 的计算机上运行正常,则需检查该 Java 安装的 lib/ext 是否包含其他库,例如 Bouncy Castle 具有支持 PBKDF2WithHmacSHA512 的 JCE 提供程序。在这种情况下,您需要在其他计算机的 Java 安装中包含相同的库。

看起来升级到Java 8会很快发生。在Java 8中肯定可以正常工作,因此在机器之间调试这个问题是毫无意义的。感谢您的帮助。 - Michael Cropper

2
如果有任何Android开发人员遇到同样的问题,请继续阅读。我也遇到了相同的问题。

NoSuchAlgorithmException: SecretKeyFactory PBKDF2withHmacSHA256 implementation not found

我试图将Java7升级到Java8, 但没有帮助。奇怪的是它在一些设备上工作,而在其他设备上失败。你可能认为SecretKeyFactory位于javax中,因此它是JDK的一部分,与Android API级别无关。
事实上,在Android系统中,不同API级别存在各种安全提供程序,并且SecretKeyFactory提供了来自这些提供程序的算法实现。根据此处此处的信息,只有从API 26开始才有PBKDF2withHmacSHA256。如果您想要在旧版Android系统上运行功能,则可以切换到仅从API 10开始提供的PBKDF2withHmacSHA1,或者进行适当的自定义实现。 另一个选项是从https://gist.github.com/jtan189/3804290复制算法代码并放入您的项目中。

2

我遇到了同样的错误,因为我正在使用PowerMockRunner运行单元测试,即:

@RunWith(PowerMockRunner.class)
public class MyTest {
    //...
}

对我来说,移除 @RunWith(PowerMockRunner.class) 就解决了这个问题。


不必删除PowerMock,参见此答案:https://dev59.com/RXrZa4cB1Zd3GeqP5q8X#22249508 - Lirux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接