在生產環境(Windows 2008 R2,AMD 64,8 GB RAM)中,應用程序有時會拋出以下異常 - 重新啓動應用程序可解決問題。在Windows中Java SecureRandom.generateSeed失敗:意外的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
回報假,但我不知道它爲什麼失敗,以及如何解決它。
任何人都知道爲什麼會發生這種情況,解決這個問題或如何繼續調查這個問題?
感謝您的任何建議或答覆。謝謝...
順便說一句 - 我發現了以下資源 - 但對這個問題並不是很有用。
看看答案[here](http://stackoverflow.com/questions/8667129/cryptacquirecontexta-fails-in-c-clr-換aloaha的加密提供者)。你的環境中是否有可能的競爭條件? – Mersenne 2012-03-27 09:23:51