我有一个扩展应用程序的类。在 onCreate() 方法中,我启动了一些线程,它调用:
KeyFactory.getInstance("RSA")
通常它工作得很好,但有时(非常罕见)我会遇到这样的异常:
W/System.err(24537): java.security.NoSuchAlgorithmException: KeyFactory RSA implementation not found
W/System.err(24537): at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
W/System.err(24537): at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:151)
W/System.err(24537): at java.security.KeyFactory.getInstance(KeyFactory.java:81)
看起来像一场比赛......我认为在我的线程调用“RSA”时安全系统没有初始化。
这是一个已知的问题?谁能给我一些提示?
我在 4.0.3 设备上遇到了这个问题(不知道其他版本)。
更多细节:
我试过这样的代码:
Provider providers[] = Security.getProviders();
try {
k1 = KeyFactory.getInstance("RSA");
}
catch(Exception e) {
e1 = e;
}
try {
k2 = KeyFactory.getInstance("RSA", "BC");
}
catch(Exception e) {
e2 = e;
}
try {
k3 = KeyFactory.getInstance("RSA");
}
catch(Exception e) {
e3 = e;
}
if(k1 == null || k2 == null || k3 == null) {
if(e1 != null)
e1.printStackTrace();
if(e2 != null)
e2.printStackTrace();
if(e3 != null)
e3.printStackTrace();
}
for(Provider provider : providers) {
System.out.println(provider.getName());
}
这是我不时得到的:
k1 is null
k2 is <key>
k3 is null
e1.printStackTrace();
04-20 22:09:33.322: W/System.err(17249): java.security.NoSuchAlgorithmException: KeyFactory RSA implementation not found
04-20 22:09:33.322: W/System.err(17249): at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
04-20 22:09:33.322: W/System.err(17249): at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:151)
04-20 22:09:33.322: W/System.err(17249): at java.security.KeyFactory.getInstance(KeyFactory.java:81)
...
e2
null
e3.printStackTrace();
04-20 22:10:08.512: W/System.err(17249): java.security.NoSuchAlgorithmException: KeyFactory RSA implementation not found
04-20 22:10:08.532: W/System.err(17249): at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
04-20 22:10:08.532: W/System.err(17249): at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:151)
04-20 22:10:08.542: W/System.err(17249): at java.security.KeyFactory.getInstance(KeyFactory.java:81)
...
providers
AndroidOpenSSL
DRLCertFactory
BC
Crypto
HarmonyJSSE
MyProvider
虽然大多数时候我都初始化了所有 k1、k2、k3 ......
听起来 getInstance("RSA", "BC") 是一个解决方案(虽然我不明白为什么),但问题是 BouncyCastle 在某些 Android 设备上可能会丢失(据我所知),所以我应该不要在这个电话中指定“BC”......所以我又遇到了一个问题。