PBKDF2WithHmacSHA512 SecretKeyFactory 不可用

问题描述 投票:0回答:3

这是一个非常奇怪的错误。在两台机器上,代码运行完美。我刚刚在一台全新的机器上设置了它,但它不起作用。运行脚本时出现以下错误;

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

导致错误的代码行是;

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

使用JDK 1.7.0

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

想法?

java exception
3个回答
7
投票

Java 8 中添加了对 PBKDF2WithHmacSHA512 的支持,Java 7 中默认不支持(Java 7 本身仅支持 PBKDF2WithHmacSHA1)。

比较:

  • SecretKeyFactory
    Java 7 的算法

    PBKDF2WithHmacSHA1

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

  • SecretKeyFactory

     Java 8 的算法

    PBKDF2With<prf>

    PKCS #5 2.0 中使用指定伪随机函数 (

    <prf>
    ) 的基于密码的密钥派生算法。示例:PBKDF2WithHmacSHA256。

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

如果您的代码在另一台装有 Java 7 的计算机上运行正常,请检查该 Java 安装的

lib/ext

是否包含其他库,例如 Bouncy Castle 有一个支持 PBKDF2WithHmacSHA512 的 JCE 提供程序。在这种情况下,您需要在另一台计算机的 Java 安装中包含相同的库。

    


2
投票
PowerMockRunner

运行单元测试,即:


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

删除
@RunWith(PowerMockRunner.class)

为我解决了这个问题。

    


2
投票
Android 开发者

遇到同样的问题,请继续阅读。 我也遇到了同样的问题。

NoSuchAlgorithmException:SecretKeyFactory PBKDF2withHmacSHA256 未找到实施

我尝试从 Java 7 升级到 Java 8,但没有帮助。奇怪的是,它在某些设备上运行正常,而在其他设备上则失败。你会认为
SecretKeyFactory

位于

javax
中,所以它是 JDK 部分,与 Android API 级别无关。
事实是,在 Android 系统上,有针对不同 API 级别的各种安全提供程序,并且 

SecretKeyFactory

提供了来自该提供程序的算法的实现,并且基于

here
here PBKDF2withHmacSHA512 的信息仅可从 API 26 获得。如果您想在旧版 Android 系统上使用功能,您可以切换到
PBKDF2withHmacSHA1
(可从 API 10 获取)或执行/使用所需的一些自定义实现。

其他选项是

https://gist.github.com/jtan189/3804290复制粘贴算法的代码并放入您的项目中。

    

© www.soinside.com 2019 - 2024. All rights reserved.