![](/img/trans.png)
[英]SecretKeyFactory.getInstance(“PBKDF2WithHmacSHA512”) throws NoSuchAlgorithmException
[英]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
但没有帮助。 奇怪的是,它在某些设备上运行正常,而在其他设备上却失败了。 你会认为SecretKeyFactory
在javax
所以它是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.