2012-05-30 6 views
1

Java 웹 응용 프로그램에서 작업 중이며 3DES 알고리즘을 사용하여 MAC을 생성해야합니다. 코드는 Weblogic 10.3에서 문제없이 작동하지만 비슷한 웹 로직 버전 (10.3.1)에서 응용 프로그램을 실행하려고하면 문제가 발생합니다.

이 내 코드입니다 :

public String getMac(String inkey, String data) throws Exception { 

    byte[] out = new byte[8]; 

    try { 

     // if I commend this line, the result is the same 
     Security.addProvider(new BouncyCastleProvider()); 

     // this loop proves the BC provider is there 
     for (Provider p : Security.getProviders()) { 

      log.debug("--"); 
      log.debug(p.getName()); 
      log.debug(p.getInfo()); 
     } 

     try { 

      BouncyCastleProvider bc = new BouncyCastleProvider(); 

      // class is there, no problem 
      log.debug("info" + bc.getInfo()); 

      DES9797Alg3 alg3 = new DES9797Alg3(); 

      // class is there, no problem 
      log.debug("alg3" + alg3.toString()); 

     } catch (Exception e) { 
      log.error("error BouncyCastleProvider classes"); 
     } 

     log.debug("length: " + inkey.length()); 

     if (inkey.length() < 48) 
      inkey += inkey.substring(0, 16); 

     byte[] rawkey = hexStringToByteArray(inkey); 
     DESedeKeySpec keyspec = new DESedeKeySpec(rawkey); 
     SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede"); 
     SecretKey key = keyfactory.generateSecret(keyspec); 

     Mac mac = Mac.getInstance("ISO9797Alg3Mac"); 

     mac.init(key); 

     mac.update(data.getBytes()); 

     mac.doFinal(out, 0); 

    } catch (Exception e) { 

     log.error("Error generating MAC X9_19", e); 

     throw new Exception("Error generating MAC X9_19", e); 

    } 

그리고 이것은 내가 오류입니다 :

Caused by: java.security.InvalidKeyException: No installed provider supports this key: com.sun.crypto.provider.DESedeKey 
    at javax.crypto.Mac.a(DashoA13*..) 
    at javax.crypto.Mac.init(DashoA13*..) 
    at es.indra.netplus.sec.services.util.UtilMac.getMac(UtilMac.java:180) 
    ... 73 more 
Caused by: java.security.NoSuchAlgorithmException: class configured for Mac(provider: BC)cannot be found. 
    at java.security.Provider$Service.getImplClass(Provider.java:1268) 
    at java.security.Provider$Service.newInstance(Provider.java:1220) 
    ... 76 more 
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.JCEMac$DES9797Alg3 
    at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:283) 
    at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:256) 
    at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:54) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
    at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:176) 
    at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:35) 
    at java.security.Provider$Service.getImplClass(Provider.java:1262) 

오류가 org.bouncycastle.jce.provider.JCEMac$DES9797Alg3가 아니라고 말한다 왜 더 이해한다. 'java.security'가 다른 곳에서 찾고있을 가능성이 있습니까? 서버 관리자에게 승인 된 디렉토리의 라이브러리를 복사 해달라고 요청했는데, 이것이 제대로 작동하는지 그리고 어떻게되는지 확실하지 않습니다.

'Security.addProvider (새 BouncyCastleProvider());' 사용 가능한 공급자 목록에 BC가 나열됩니다.

이 내가 가진 공급자 목록은 다음과 같습니다

-- -- -- 
CSSX509CertificateFactoryProvider 
CSS JDK CertPath provider 
1.0 
-- -- -- 
SUN 
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) 
1.6 
-- -- -- 
SunRsaSign 
Sun RSA signature provider 
1.5 
-- -- -- 
SunJSSE 
Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1) 
1.6 
-- -- -- 
SunJCE 
SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC) 
1.6 
-- -- -- 
SunJGSS 
Sun (Kerberos v5, SPNEGO) 
1.0 
-- -- -- 
SunSASL 
Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5) 
1.5 
-- -- -- 
XMLDSig 
XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory) 
1.0 
-- -- -- 
SunPCSC 
Sun PC/SC provider 
1.6 
-- -- -- 
WebLogicCertPathProvider 
WebLogic CertPath Provider JDK CertPath provider 
1.0 
-- -- -- 
WLSJDKCertPathProvider 
WebLogic JDK CertPath provider 
1.0 
-- -- -- 
BC 
BouncyCastle Security Provider v1.46 
1.46 

BC는 또한, 거기, 내 war 파일 내부에있어 동일한 버전.

저는 많은 시간을 운이없이 봤습니다. 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.

답변

3

코드 변경시 오류를 해결하려고 Google에서 많은 시간을 보낸 후 문제가 서버 도메인 lib 디렉토리에 라이브러리를 추가하여 해결되었습니다. 어쨌든, 나는 아직도 이것이 일어나는 이유를 이해하지 못합니다.

관련 문제