我知道Sun/Oracle中的keylenght出于明智的原因是有限的。然而,据我所知,Java()的概念是,用户可以选择自己的安全提供者来弥补这个限制。
出于这个原因,我试图将弹跳城堡作为安全提供者与Orcale JDK1.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 JDK1.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的密钥吗?
发布于 2014-09-15 12:41:02
键长度限制是在JCE中确定的,即在JRE中,而不是在提供程序中。JCE在将限制移交给提供程序之前对其进行检查。
正确的解决方案是安装无限强度策略文件。虽然这可能是您的开发工作站的正确解决方案,但让非技术用户在每台计算机上安装这些文件很快就成为一个主要的麻烦(如果不是障碍的话)。不可能将文件与程序一起分发;它们必须安装在JRE目录中(由于权限甚至可能是只读的)。
不过,Bouncy城堡确实提供了自己的API,这与JCE是分开的。此API不强制执行任何密钥长度限制。这也不是一个理想的解决方案,因为API与JCE完全不同,绑定到BC,BC是一个额外的1MB库,可以随程序一起分发。
最后,还有一个更详细的这里描述的反射解决方案。
OpenJDK没有任何密钥长度限制,所以它们都是简单的Integer.MAX_VALUE。
https://stackoverflow.com/questions/25844026
复制相似问题