![](/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.