W środowisku produkcyjnym (Windows 2008 R2, AMD 64, 8 GB RAM) aplikacja czasami zgłasza następujący wyjątek - ponowne uruchomienie aplikacji rozwiązuje problem.W systemie Windows Java SecureRandom.generateSeed nie powiodło się: nieoczekiwany błąd 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)
Kod powinien mieć żadnego problemu:
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);
}
przyjrzał kodu JDK, dowiedzieć się, że jest błąd, ponieważ Java_sun_security_provider_NativeSeedGenerator_nativeGenerateSeed
powraca fałszywy:
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
lub CryptAcquireContextA
powraca fałszywy, ale nie wiem, dlaczego to się nie powiedzie, i jak go obejść.
Ktoś wie, dlaczego tak się dzieje, jak obejść lub jak dalej badać ten problem?
Dzięki za porady lub odpowiedzi. Dzięki ...
Btw - Znalazłem następujące zasoby - ale nie całkiem przydatne dla tego problemu.
Spójrz na odpowiedź [tutaj] (http://stackoverflow.com/questions/8667129/cryptacquirecontexta-fails-in-c-clr- dla dostawcy-kryptograficznego-alahaha). Czy warunki wyścigu są możliwe w twoim otoczeniu? – Mersenne