Java 開發者必備:一文解決 AES 加密中的“非法金鑰大小”異常

净重21克發表於2024-08-16

徹底告別 java.security.InvalidKeyException,輕鬆應對不同 JDK 版本

引言

  在 Java 開發過程中,我們經常會遇到各種各樣的安全相關的問題。其中一個常見的問題是當使用 Java 的加密功能時遇到的 “Illegal key size or default parameters” 錯誤。本文將詳細介紹如何解決這一問題,包括問題的背景、原因分析、解決方案以及實踐步驟。

問題背景

  從Java 1.4引入JCE(Java Cryptography Extension)起,為了遵守美國出口管制法律,Oracle對預設JRE中的加密演算法設定了限制,其中AES演算法的最大金鑰長度被限制在128位。這意味著如果您嘗試使用192位或256位的AES金鑰,上述異常就會發生。

此限制影響了從Java 1.4至包括但不限於Java 8在內的多個版本。儘管Java 11及之後的版本中JCE的概念已被淡化,不再作為單獨的擴充套件提供,但金鑰長度限制依舊存在,只是後來最佳化了,預設支援更長的金鑰。

  例如,對於 AES 加密演算法,預設只允許使用 128 位的金鑰長度。這可能會導致在實際開發過程中遇到 java.security.InvalidKeyException: Illegal key size or default parameters 的異常。

問題影響版本

  此問題最早出現在 Java 6 和 Java 7 中,因為這些版本預設對金鑰大小進行了嚴格的限制,使用大於 128 位的金鑰長度時也將會觸發此異常。從 JDK 8 Update 131 開始,這個問題已經被預設解決了,即預設支援更大的金鑰大小。

  注意事項

  JDK 8 Update 131 及之後的版本預設包含了無限制的 JCE 策略檔案。應當是不會出現上述問題的。

  確保在安裝無限制策略檔案前瞭解相關的安全和合規要求,特別是在受監管的環境中。

  如果您使用的是 OpenJDK 或其他非 Oracle JDK 發行版,可能需要手動安裝這些策略檔案,即使您的 JDK 版本高於 JDK 8 Update 131。沒嘗試,此問題可自行驗證

錯誤日誌示例

假設你在使用 AES 加密時遇到了此問題,錯誤日誌可能如下所示:

1 java.security.InvalidKeyException: Illegal key size or default parameters
2     at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026)
3     at javax.crypto.Cipher.implInit(Cipher.java:801)
4     at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
5     at javax.crypto.Cipher.init(Cipher.java:1249)
6     at javax.crypto.Cipher.init(Cipher.java:1186)
7     at com.ulic.claimService.util.Demo.aesEncrypt(Demo.java:204)
8     at com.ulic.claimService.util.Demo.main(Demo.java:57)

解決方案

  要解決這個問題,需要下載並安裝 Java Cryptography Extension (JCE) 無限制強度管轄策略檔案。下面是詳細的步驟:

確定你的 Java 版本:

  開啟命令列工具,執行 java -version 命令來確認你正在使用的 Java 版本。

下載 JCE 無限制強度管轄策略檔案:

  訪問 Oracle 官方網站下載適用於你的 Java 版本的 JCE 檔案。

  對於 Java 8,你可以訪問 這裡 下載。

  對於 Java 11 或更高版本,,預設已支援無限制的金鑰長度,無需下載配置相應的 JCE 無限制策略檔案。

替換現有的策略檔案:

  找到你的 Java 安裝目錄下的 lib/security 資料夾。路徑通常是 %JAVA_HOME%\jre\lib\security(Windows) $JAVA_HOME/jre/lib/security(Linux/Mac)。
  在該目錄中,你會看到兩個檔案:local_policy.jarUS_export_policy.jar。
  使用從 Oracle 下載的相應檔案替換這兩個檔案。(注意備份原檔案)

重新啟動應用程式:

  替換檔案後,確保重啟你的應用程式以應用新的策略檔案。

  再次執行你的程式,看看異常是否已經消失。

相關文章