jef*_*uan 6 java windows random
在生产环境(Windows 2008 R2,AMD 64,8 GB RAM)中,应用程序有时会抛出以下异常 - 重新启动应用程序可以解决问题.
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)
Run Code Online (Sandbox Code Playgroud)
代码应该没有问题:
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);
}
Run Code Online (Sandbox Code Playgroud)
看看JDK代码,发现错误是因为Java_sun_security_provider_NativeSeedGenerator_nativeGenerateSeed返回false:
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;
}
Run Code Online (Sandbox Code Playgroud)
CryptGenRandom或CryptAcquireContextA返回false,但我不知道它为什么会失败,以及如何解决它.
任何人都知道为什么会这样,工作或如何继续调查这个问题?
感谢您的任何建议或回复.谢谢...
顺便说一句 - 我找到了以下资源 - 但对这个问题并不十分有用.
虽然您的问题听起来像是并发访问问题,但我为您提供了一个解决方法:使用 bouncycastle 作为 JCE 提供程序,看看是否可以解决您的问题。将 jar 放入类路径中,然后在某个时候运行以下代码:Security.addProvider(new BouncyCastleProvider());
| 归档时间: |
|
| 查看次数: |
3984 次 |
| 最近记录: |