Java安全性:密鑰大小或默認參數非法?

我早些時候曾問過一個問題,但沒有獲得正確的回答,也無濟於事。 html

所以,我澄清了有關該問題的一些細節,我真的很想聽聽您關於如何解決此問題或應該嘗試的想法。 java

我在Linux服務器上安裝了Java 1.6.0.12 ,下面的代碼運行得很完美。 api

String key = "av45k1pfb024xa3bl359vsb4esortvks74sksr5oy4s5serondry84jsrryuhsr5ys49y5seri5shrdliheuirdygliurguiy5ru";
try {
    Cipher c = Cipher.getInstance("ARCFOUR");

    SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "ARCFOUR");
    c.init(Cipher.DECRYPT_MODE, secretKeySpec);

    return new String(c.doFinal(Hex.decodeHex(data.toCharArray())), "UTF-8");

} catch (InvalidKeyException e) {
    throw new CryptoException(e);
}

今天,我在服務器用戶上安裝了Java 1.6.0.26 ,當我嘗試運行應用程序時,出現如下異常。 個人猜想是它與Java安裝配置有關,由於它在第一個版本中有效,但在更高版本中不起做用。 安全

Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
    at my.package.Something.decode(RC4Decoder.java:25) ~[my.package.jar:na]
    ... 5 common frames omitted

第25行是: c.init(Cipher.DECRYPT_MODE, secretKeySpec); 服務器

筆記:
*服務器1.6.0.12 java目錄上的java.security與1.6.0.26 java.security文件幾乎徹底匹配。 第一個中沒有其餘提供程序。
*上一個問題在這裏oracle


#1樓

對於JAVA 7,下載連接爲jce-7-download jvm

將兩個下載的jar複製到Java \\ jdk1.7.0_10 \\ jre \\ lib \\ security中
備份較舊的罐子,以確保安全。 ide

對於JAVA 8,下載連接爲jce-8-download
將下載的jar複製到Java \\ jdk1.8.0_45 \\ jre \\ lib \\ security中
備份較舊的罐子,以確保安全。 ui


#2樓

能夠在如下位置找到JRE / JDK / Java 8管轄區文件: 加密

Java密碼術擴展(JCE)無限強度管轄權策略文件8下載

就像詹姆斯在上面說的那樣:
將文件安裝在${java.home}/jre/lib/security/


#3樓

問題是若是安裝JRE,則文件夾jre \\ lib \\ securitylocal_policy.jar中文件default_local.policy內容

// Some countries have import limits on crypto strength. This policy file
// is worldwide importable.

grant {
    permission javax.crypto.CryptoPermission "DES", 64;
    permission javax.crypto.CryptoPermission "DESede", *;
    permission javax.crypto.CryptoPermission "RC2", 128,
                                     "javax.crypto.spec.RC2ParameterSpec", 128;
    permission javax.crypto.CryptoPermission "RC4", 128;
    permission javax.crypto.CryptoPermission "RC5", 128,
          "javax.crypto.spec.RC5ParameterSpec", *, 12, *;
    permission javax.crypto.CryptoPermission "RSA", *;
    permission javax.crypto.CryptoPermission *, 128;
};

若是您不須要全球有效的設置,則只需編輯此文件並將內容更改成

// Country-specific policy file for countries with no limits on crypto strength.
grant {
    // There is no restriction to any algorithms.
    permission javax.crypto.CryptoAllPermission;
};

若是從Oracle下載JCE,這將獲得什麼。


#4樓

在Java中,默認狀況下AES支持128位密鑰,若是您計劃使用192位或256位密鑰,則Java編譯器將拋出非法的密鑰大小異常,您將獲得該異常。

該解決方案是根據victor&James的建議,您須要根據您的JRE版本(java6,java7或java8)下載JCE(Java密碼學擴展)。

JCE壓縮文件包含如下JAR:

  1. local_policy.jar
  2. US_export_policy.jar

您須要從<JAVA_HOME>/jre/lib/security替換這些jar。 若是您使用的是Unix系統,則可能會參考/home/urs/usr/lib/jvm/java-<version>-oracle/

有時僅替換安全文件夾中的local_policy.jar和US_export_policy.jar在Unix上不起做用,因此我建議首先將安全文件夾複製到您的桌面,替換jar的@ Desktop / security文件夾,從/ jre / lib中刪除安全文件夾/&將桌面安全文件夾移動到/ jre / lib /。

例如:: sudo mv security /usr/lib/jvm/java-7-oracle/jre/lib


#5樓

默認狀況下,Java僅支持AES 128位(16字節)密鑰大小進行加密。 若是您不須要的只是默認支持,則能夠在使用Cipher以前將密鑰修整爲適當的大小。 有關默認支持的鍵,請參見javadoc

這是生成無需修改策略文件便可在任何JVM版本上使用的密鑰的示例。 自行決定使用。

這是一篇關於AgileBits博客上密鑰128到256密鑰大小是否重要的​​好文章

SecretKeySpec getKey() {
    final pass = "47e7717f0f37ee72cb226278279aebef".getBytes("UTF-8");
    final sha = MessageDigest.getInstance("SHA-256");

    def key = sha.digest(pass);
    // use only first 128 bit (16 bytes). By default Java only supports AES 128 bit key sizes for encryption.
    // Updated jvm policies are required for 256 bit.
    key = Arrays.copyOf(key, 16);
    return new SecretKeySpec(key, AES);
}
相關文章
相關標籤/搜索