Ich versuche zu verstehen, wie Java-Sicherheitsanbieter in Android arbeiten. Ich möchte alle Aufrufe von Cipher.getInstance() erzwingen, um eine Chiffre mit spongy castle als Provider zurückzugeben. Ich habe kein Glück.Android Registrierung Sicherheitsanbieter
Der folgende Code gibt eine Verschlüsselung mit Provider "AndroidKeyStoreBCWorkaround Version 1.0" zurück, aber ich möchte, dass der Provider SpongyCastle ist.
Der Grund, warum ich dies tun möchte, ist, dass ich eine Bibliothek habe, die javax.crypto.Cipher.getInstance() mehrfach aufruft. Ich möchte, dass alle diese Anrufe in das schwammige Schloss gehen, ohne die Bibliothek neu schreiben zu müssen, um "SC" als Provider explizit anzugeben.
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)
{
}
}
}
'Security.insertProviderAt' gibt die Position zurück, an der der Provider hinzugefügt wurde. Können Sie überprüfen, dass es nicht "-1" ist (was bedeutet, dass nicht hinzugefügt)? – rds
Warum rufen Sie 'Security.removeProvider (" BC ")' direkt nach der Installation des Providers auf? – rds
@rds: org.spongycastle.jce.provider.BouncyCastleProvider = "SC" und NICHT "BC". Er fügt Spongy ein und entfernt dann Bouncy. – JDOaktown