2015-12-10 18 views
9

私はJavaセキュリティプロバイダがどのようにAndroidで動作するかを理解しようとしています。私はCipher.getInstance()へのすべての呼び出しを強制的にspongy castleをプロバイダとして返すようにしたいと思います。私は運がない。セキュリティプロバイダを登録しているAndroid

次のコードは、プロバイダが「AndroidKeyStoreBCWorkaroundバージョン1.0」である暗号を返しますが、プロバイダをSpongyCastleにします。

私がこれをやりたい理由は、javax.crypto.Cipher.getInstance()を複数回呼び出すライブラリがあるからです。私はこれらの呼び出しがスポンジー城に行くことを望んでいます。プロバイダとして明示的に "SC"を指定するためにライブラリを書き直す必要はありません。

public class MainActivity extends Activity 
{ 
    static 
    { 
     Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1); 
     Security.removeProvider("BC"); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     try 
     { 
      //this returns provider = "AndroidKeyStoreBCWorkaround version 1.0" 
      javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("AES/CTR/NoPadding"); 
      //this works 
      // cipher = javax.crypto.Cipher.getInstance("AES/CTR/NoPadding", "SC"); 
     } 
     catch(Exception e) 
     { 
     } 
    } 
} 
+0

'Security.insertProviderAt'は、プロバイダが追加された位置を返します。 '-1'でないことを確認できますか(これは追加されないことを意味します)? – rds

+0

プロバイダをインストールした直後に 'Security.removeProvider(" BC ")をなぜ呼び出すのですか? – rds

+0

@rds:org.spongycastle.jce.provider.BouncyCastleProvider = "SC" "BC"ではありません。 彼はスポンジを挿入して弾みを取り除いています。 – JDOaktown

答えて

3

javax.crypto.Cipher.getInstanceを呼び出す別のクラスを作成し、それに "SC"変数を渡すだけです。元のライブラリに変更を加えることなくこれを行うことができ、提供したコードと同じファイルで実行することができます。この回答は過度に単純だと思われるかもしれませんが、おそらくあなたの質問には他の側面がありますか?とにかくそれは答えです。

関連する問題