首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Java密码扩展的密钥长度限制

基于Java密码扩展的密钥长度限制
EN

Stack Overflow用户
提问于 2014-09-15 08:45:34
回答 1查看 13.7K关注 0票数 6

我知道Sun/Oracle中的keylenght出于明智的原因是有限的。然而,据我所知,Java()的概念是,用户可以选择自己的安全提供者来弥补这个限制。

出于这个原因,我试图将弹跳城堡作为安全提供者与Orcale JDK1.7一起操作。

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

代码语言:javascript
复制
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 JDK1.7及其在提供者中构建的输出是:

代码语言:javascript
复制
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除外),如下所示:

代码语言:javascript
复制
MaxAllowedKeyLength (for 'BC version 1.46' using current 'JCE Policy Files'):
  DES        = 64
  Triple DES = 128
  AES        = 128
  Blowfish   = 128
  RSA        = 2147483647

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

代码语言:javascript
复制
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的密钥吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-15 12:41:02

键长度限制是在JCE中确定的,即在JRE中,而不是在提供程序中。JCE在将限制移交给提供程序之前对其进行检查。

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

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

最后,还有一个更详细的这里描述的反射解决方案

OpenJDK没有任何密钥长度限制,所以它们都是简单的Integer.MAX_VALUE

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25844026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档