2012-03-27 71 views
6

運用環境(Windows 2008 R2、AMD 64,8 GB RAM)では、アプリケーションを再起動すると問題が解決されることがあります。Java SecureRandom.generateSeed failed:予期しないCryptoAPIエラー

Caused by: java.lang.InternalError: Unexpected CryptoAPI failure generating seed 
at sun.security.provider.NativeSeedGenerator.getSeedBytes(NativeSeedGenerator.java:43) 
at sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:117) 
at sun.security.provider.SecureRandom.engineGenerateSeed(SecureRandom.java:114) 
at java.security.SecureRandom.generateSeed(SecureRandom.java:475) 

コードは何の問題もないはずです、

public void generateToken() 
    { 
     SecureRandom secureRandom = new SecureRandom(); 
     int seedByteCount = 20; 
     byte[] seed = secureRandom.generateSeed(seedByteCount); 
     secureRandom.setSeed(seed); 
     String random = String.valueOf(secureRandom.nextLong()); 
     setToken(random); 
    } 

は、JDKのコードを見ていたが、エラーがあることを見つけるためJava_sun_security_provider_NativeSeedGenerator_nativeGenerateSeed戻り

OpenJDKの-7u2 -fcs-src-b13-17_nov_2011 \ jdk \ src \ windows \ native \ sun \ security \ provider \ WinCAPISeedGenerator.c:

JNIEXPORT jboolean JNICALL Java_sun_security_provider_NativeSeedGenerator_nativeGenerateSeed(JNIEnv *env, jclass clazz, jbyteArray randArray) 
    { 
     HCRYPTPROV hCryptProv; 
     jboolean result = JNI_FALSE; 
     jsize numBytes; 
     jbyte* randBytes; 

     if (CryptAcquireContextA(&hCryptProv, "J2SE", NULL, PROV_RSA_FULL, 0) == FALSE) { 
      /* If CSP context hasn't been created, create one. */ 
      if (CryptAcquireContextA(&hCryptProv, "J2SE", NULL, PROV_RSA_FULL, 
        CRYPT_NEWKEYSET) == FALSE) { 
       return result; 
      } 
     } 

     numBytes = (*env)->GetArrayLength(env, randArray); 
     randBytes = (*env)->GetByteArrayElements(env, randArray, NULL); 
     if (CryptGenRandom(hCryptProv, numBytes, randBytes)) { 
      result = JNI_TRUE; 
     } 
     (*env)->ReleaseByteArrayElements(env, randArray, randBytes, 0); 

     CryptReleaseContext(hCryptProv, 0); 

     return result; 
    } 

CryptGenRandomまたはCryptAcquireContextA戻り、私はそれが失敗した理由がわからないし、それを回避する方法。

これがなぜ起こるのか、回避するか、この問題の調査を続ける方法は誰でも知っていますか?

アドバイスやご回答ありがとうございます。ありがとう...

Btw - 私は以下のリソースを見つけました - しかし、この問題にはあまり役に立ちません。

+1

答え[ここ](http://stackoverflow.com/questions/8667129/cryptacquirecontexta-fails-in-c-clr- for-aloaha-cryptographic-provider)である。あなたの環境で競争条件が可能ですか? – Mersenne

答えて

2

あなたの問題は、同時アクセスのようなにおいがしながら問題は、私はあなたのための回避策を持っています:JCEプロバイダとしてbouncycastleを使用し、問題が解決するかどうかを確認します。あなたのクラスパスに瓶を入れて、次にこのコードを実行してください:Security.addProvider(new BouncyCastleProvider());

+0

ご回答ありがとうございます。はい、これは同時アクセス関連の問題だとお伝えしましたが、私たちはコードを最適化しています:古いコードでは、generateSeedが多くのリソースを消費するため、新しいコードでは、generateSeedを1回だけ呼び出します。これは、顧客が遭遇した問題を解決したようです。 –

関連する問題