PBKDF2WithHmacSHA512 SecretKeyFactory不可用

时间:2017-11-20 13:17:02

标签: java exception

这是一个非常奇怪的错误。在两台机器上,代码运行完美。我只是在一台全新的机器上进行设置,这是不行的。我在运行脚本时遇到以下错误;

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

导致错误的代码行是;

SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance( "PBKDF2WithHmacSHA512" );

使用JDK 1.7.0

代码正在全部正确编译,它只是在此行的运行时失败。我有一种感觉,这与一个不同的JAR文件或稍微不同的JDK有关,但是在检查了不同机器上的所有内容后,一切看起来都是一样的。

思想?

3 个答案:

答案 0 :(得分:4)

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

比较

  • SecretKeyFactory Algorithms for Java 7

      

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

  • SecretKeyFactory Algorithms for Java 8

      

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

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

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

答案 1 :(得分:2)

如果有任何 Android开发人员出现相同问题,请继续阅读。

我遇到了同样的问题。

NoSuchAlgorithmException:SecretKeyFactory PBKDF2withHmacSHA256 找不到实现

我尝试从Java7升级到Java8,但没有帮助。奇怪的是,它在某些设备上运行而在其他设备上失败。您会认为SecretKeyFactoryjavax中,因此它是JDK的一部分,与Android API级别无关。

问题是,在Android系统上,存在各种用于不同API级别的安全提供程序,并且SecretKeyFactory根据信息herehere {{ 1}}仅可用于API 26。如果您想让功能在较旧的Android系统上运行,则可以切换到PBKDF2withHmacSHA512,该API可从API 10获得,或者执行/使用所需的一些自定义实现。

其他选项是从PBKDF2withHmacSHA1复制粘贴算法的代码并放入您的项目中。

答案 2 :(得分:1)

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

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

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