这是一个非常奇怪的错误。在两台机器上,代码运行完美。我只是在一台全新的机器上进行设置,这是不行的。我在运行脚本时遇到以下错误;
java.lang.RuntimeException: java.security.NoSuchAlgorithmException: PBKDF2WithHmacSHA512 SecretKeyFactory not available
导致错误的代码行是;
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance( "PBKDF2WithHmacSHA512" );
使用JDK 1.7.0
代码正在全部正确编译,它只是在此行的运行时失败。我有一种感觉,这与一个不同的JAR文件或稍微不同的JDK有关,但是在检查了不同机器上的所有内容后,一切看起来都是一样的。
思想?
答案 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
,但没有帮助。奇怪的是,它在某些设备上运行而在其他设备上失败。您会认为SecretKeyFactory
在javax
中,因此它是JDK
的一部分,与Android API级别无关。
问题是,在Android系统上,存在各种用于不同API级别的安全提供程序,并且SecretKeyFactory
根据信息here和here {{ 1}}仅可用于API 26。如果您想让功能在较旧的Android系统上运行,则可以切换到PBKDF2withHmacSHA512
,该API可从API 10获得,或者执行/使用所需的一些自定义实现。
其他选项是从PBKDF2withHmacSHA1
复制粘贴算法的代码并放入您的项目中。
答案 2 :(得分:1)
我遇到了同样的错误,因为我正在使用PowerMockRunner
进行单元测试,即:
@RunWith(PowerMockRunner.class)
public class MyTest {
//...
}
删除@RunWith(PowerMockRunner.class)
为我解决了这个问题。