2012-04-19 11 views
3

私はアプリケーションを拡張するクラスを持っています。 onCreate()メソッドでは、私はいくつかのスレッドを起動し、それが呼び出されます:Android。 KeyFactory 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を初期化します...

ke getInstance( "RSA"、 "BC")は解決策ですが(理由はわかりませんが)、BouncyCastleは一部のAndroid搭載機では見逃せます(私が知る限り)。この呼び出しで "BC" ...もう一度、私は問題があります。

答えて

1

これはどのデバイスですか?これはレースではなく、HarmonyプロバイダはRSAの実装を持っていません。しかし、BouncyCastleプロバイダは、それをそこから得ることができるはずです。明示的にプロバイダ名を指定してみてください。

興味深い
KeyFactory kf = KeyFactory.getInstance("RSA", "BC"); 
+0

、時間からにところで、私は同じデバイス(ASUSのEEEパッド、4.0.3)でこのエラーが出る... RSAは、いくつかのデバイス上で逃したことができるとは思いませんでした私の場合、RSAプロバイダは常にここにいます。 – alex2k8

+0

署名/検証用のRSAをサポートしていても、すべてのプロバイダがRSA鍵の生成および/またはエクスポート/インポートをサポートするわけではありません。 Androidには少なくとも3つのJCEプロバイダがあり、そのうちのBouncyCastleが最も多くのアルゴリズム/メカニズムを持っています。明示的にプロバイダを指定しない場合、 'getInstance()'はそれをサポートするもの(通常はBC)から実装を取得する必要があります。ときどき動作するのであれば、実際にはバグかもしれません。 –

+0

私はプロバイダとそのプロパティをダンプしましたが、RSAをサポートしているのは "BC version 1.46"だけです...セキュリティプロバイダがロードされたとき、すべてのプロバイダがロードされ、使用準備が整うまで待つ方法はありますか? – alex2k8

関連する問題