Java PBKDF2WithHmacSHA512 SecretKeyFactory不可用

Java PBKDF2WithHmacSHA512 SecretKeyFactory不可用,java,exception,Java,Exception,这是一个非常奇怪的错误。在两台机器上,代码运行良好。我刚在一台全新的机器上安装了这个,但它不起作用。我在运行脚本时遇到以下错误: java.lang.RuntimeException: java.security.NoSuchAlgorithmException: PBKDF2WithHmacSHA512 SecretKeyFactory not available 导致错误的代码行为 SecretKeyFactory secretKeyFactory = SecretKeyFactory.g

这是一个非常奇怪的错误。在两台机器上,代码运行良好。我刚在一台全新的机器上安装了这个,但它不起作用。我在运行脚本时遇到以下错误:

java.lang.RuntimeException: java.security.NoSuchAlgorithmException: PBKDF2WithHmacSHA512 SecretKeyFactory not available
导致错误的代码行为

SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance( "PBKDF2WithHmacSHA512" );
使用JDK1.7.0

代码编译正确,只是在这一行的运行时失败了。我有一种感觉,这与不同的JAR文件或略有不同的JDK有多大关系,但在检查了不同机器上的所有内容后,所有内容看起来都是相同的


想法?

Java 8中添加了对PBKDF2WithHmacSHA512的支持,默认情况下,它在Java 7中不可用(Java 7本身仅支持PBKDF2WithHmacSHA1)

比较:

  • 适用于Java 7

    PBKDF2WithHmacSHA1
    使用PKCS#5 v2.0中基于密码的密钥派生函数构造密钥

  • 适用于Java 8

    使用指定的伪随机函数(
    )在PKCS#5 2.0中找到基于密码的密钥派生算法的PBKDF2。示例:PBKDF2WithHmacSHA256

因此,您需要升级到Java 8,或者降级到PBKDF2WithHmacSHA1,或者检查是否有JCE提供程序为Java 7提供PBKDF2WithHmacSHA512(例如Bouncy Castle)


如果您的代码在另一台使用Java 7的机器上运行正常,那么请检查该Java安装的
lib/ext
是否包含其他库,例如Bouncy Castle有一个JCE提供程序,它支持PBKDF2WithHmacSHA512。在这种情况下,您将需要在另一台计算机的Java安装中包含相同的库。

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

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

删除
@RunWith(PowerMockRunner.class)
为我解决了这个问题。

如果有Android开发者带着同样的问题来到这里,请继续阅读

我也有同样的问题

NoSuchAlgorithmException:带有HMACSHA256的SecretKeyFactory PBKDF2 未找到实现

我试着从
Java7
升级到
Java8
,但没有效果。奇怪的是,它在一些设备上工作,而在其他设备上失败。你会认为
SecretKeyFactory
javax
中,所以它是
JDK
的一部分,与Android的API级别无关

事情是,在Android系统上,有各种不同API级别的安全提供商,
SecretKeyFactory
提供该提供商的算法实现,并且基于这些信息,
PBKDF2withHmacSHA512
仅可从API 26获得。如果您想让功能在较旧的Android系统上运行,可以切换到API 10提供的带HMACSHA1的PBKDF2,或者使用所需的一些自定义实现


其他选项是
https://gist.github.com/jtan189/3804290
并将其放入您的项目中

看起来升级到Java8的时间会更早,而不是更晚。在Java8中,在机器之间调试是毫无意义的。谢谢你的帮助。