繁体   English   中英

PBKDF2WithHmacSHA512 SecretKeyFactory 不可用

[英]PBKDF2WithHmacSHA512 SecretKeyFactory not available

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

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

导致错误的代码行是;

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

使用 JDK 1.7.0

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

想法?

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,或者检查是否有 JCE 提供程序为 Java 7 提供 PBKDF2WithHmacSHA512(例如,Bouncy Castle)。

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

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

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

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

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

我遇到了同样的问题。

NoSuchAlgorithmException:未找到 SecretKeyFactory PBKDF2withHmacSHA256 实现

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

事实是,在 Android 系统上,有针对不同 API 级别的各种安全提供程序,而SecretKeyFactory提供了来自该提供程序的算法的实现,并且基于此处此处的信息, PBKDF2withHmacSHA512仅可从 API 26 获得。 如果您想在较旧的 Android 系统上使用功能,您可以切换到 API 10 中提供的PBKDF2withHmacSHA1 ,或者执行/使用所需的一些自定义实现。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM