【问题标题】:Key length limit with Java Cryptography ExtensionJava Cryptography Extension 的密钥长度限制
【发布时间】:2014-09-15 08:45:34
【问题描述】:

我知道出于司法原因,Sun/Oracle JVM 中的密钥长度是有限的。然而,据我了解,JCE(Java Cryptography Extension) 的概念是用户可以选择自己的安全提供程序来弥补这一限制。

出于这个原因,我尝试将Bounce Castle 作为安全提供程序与Orcale JDK 1.7 一起使用。

为了找出实际允许的密钥长度,我使用了以下代码:

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import java.security.GeneralSecurityException;
import java.security.Provider;
import java.security.Security;

public class JCETest {
public static void main( String[] args ) throws GeneralSecurityException
{

    BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
    Security.addProvider(bouncyCastleProvider);

    System.out.println( "\nSecurity-Provider:" );
    for( Provider prov : Security.getProviders() ) {
        System.out.println( "  " + prov + ": " + prov.getInfo() );
    }
    System.out.println( "\nMaxAllowedKeyLength (for '" + Cipher.getInstance("AES").getProvider() + "' using current 'JCE Policy Files'):\n"
            + "  DES        = " + Cipher.getMaxAllowedKeyLength( "DES"        ) + "\n"
            + "  Triple DES = " + Cipher.getMaxAllowedKeyLength( "Triple DES" ) + "\n"
            + "  AES        = " + Cipher.getMaxAllowedKeyLength( "AES"        ) + "\n"
            + "  Blowfish   = " + Cipher.getMaxAllowedKeyLength( "Blowfish"   ) + "\n"
            + "  RSA        = " + Cipher.getMaxAllowedKeyLength( "RSA"        ) + "\n" );
}
}

Orcale JDK 1.7 及其内置提供程序的输出是:

Security-Provider:
  SUN version 1.7: SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
  SunRsaSign version 1.7: Sun RSA signature provider
  SunEC version 1.7: Sun Elliptic Curve provider (EC, ECDSA, ECDH)
  SunJSSE version 1.7: Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)
  SunJCE version 1.7: SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
  SunJGSS version 1.7: Sun (Kerberos v5, SPNEGO)
  SunSASL version 1.7: Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5, NTLM; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5, NTLM)
  XMLDSig version 1.0: XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)
  SunPCSC version 1.7: Sun PC/SC provider
  BC version 1.46: BouncyCastle Security Provider v1.46

MaxAllowedKeyLength (for 'SunJCE version 1.7' using current 'JCE Policy Files'):
  DES        = 64
  Triple DES = 128
  AES        = 128
  Blowfish   = 128
  RSA        = 2147483647

但是当我通过切换到应用 BC 作为提供者时

Cipher.getInstance("AES", bouncyCastleProvider).getProvider()

它仍然向我显示有限的密钥长度(RSA 除外),如下所示:

MaxAllowedKeyLength (for 'BC version 1.46' using current 'JCE Policy Files'):
  DES        = 64
  Triple DES = 128
  AES        = 128
  Blowfish   = 128
  RSA        = 2147483647

但是当我将 JDK 更改为 openJDK 时,我得到以下输出:

MaxAllowedKeyLength (for 'BC version 1.46' using current 'JCE Policy Files'):
  DES        = 2147483647
  Triple DES = 2147483647
  AES        = 2147483647
  Blowfish   = 2147483647
  RSA        = 2147483647

这让我感到惊讶,因为我的印象不是 JDK,而是安全提供者限制了密钥长度。但是我的测试表明,无论我选择哪个提供商,JDK 都在限制密钥长度。

我的问题是:我做错了什么吗?有没有办法使用 Oracle JDK 释放密钥?

标签: java cryptography bouncycastle jce jca


【解决方案1】:

密钥长度限制在 JCE 中确定,即在 JRE 中,而不是在提供程序中。 JCE 在移交给提供者之前检查限制。

解决这个问题的正确方法是安装unlimited strength policy files。虽然这可能是您的开发工作站的正确解决方案,但让非技术用户在每台计算机上安装文件很快就会成为主要的麻烦(如果不是障碍的话)。 没有办法将文件与您的程序一起分发;它们必须安装在 JRE 目录中(由于权限,它甚至可能是只读的)。

Bouncy Castle 确实提供了自己的 API,它与 JCE 是分开的。此 API 不强制执行任何密钥长度限制。这也不是一个理想的解决方案,因为 API 与 JCE 完全不同并且绑定到 BC,而 BC 是一个额外的 1MB 库,可以随您的程序分发。

最后还有一个更详细的reflection workaround described here

OpenJDK 没有任何密钥长度限制,这就是为什么它们都只是Integer.MAX_VALUE

【讨论】:

  • 非常感谢!只是关于另一个问题:我们正在开发一种无论如何都使用 openJDK 的嵌入式设备。应该首选 openJDK/JCE 或 Bouncycastle API 以提供最高质量的加密?
  • @Randy 加密算法是标准的,因此从这个角度来看并没有什么不同。但是 BC 库基本上复制了 JRE 中已经包含的功能,所以我会选择包含的提供程序。我不了解嵌入式环境,但您还可以在 x86 和 sparc 上使用 SunJCE 获得内在函数和其他优化。
  • 反射解决方法不再适用于 Java8 github.com/jruby/jruby/issues/4101
猜你喜欢
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
相关资源
最近更新 更多