簡體   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