3

Scheinen wie "Crypto" Anbieter haben in Android N.Verursacht durch: java.security.NoSuchProviderException: keine solche Anbieter: Crypto - Android N

Meine Anwendung entfernt wurden wegen NoSuchProviderException abstürzt.

Wenn ich den Provider und den Algorithmus ändere, dann betrifft das Benutzer, die alle die App gerade benutzen. Hat jemand eine Idee?

KeyGenerator kGen = KeyGenerator.getInstance(KEY_GENERATOR_ALGORITHM); 
SecureRandom sr = SecureRandom.getInstance(STR_SHA1PRNG, **CRYPTO**); 
sr.setSeed(seed); 
kGen.init(128, sr); 
SecretKey sKey = kGen.generateKey(); 

04-30 04: 07: 02,872: E/Android Runtime (17386): Verursacht durch: java.security.NoSuchProviderException: keine solche Anbieter: Crypto

Antwort

4

Zitiert Google:

Der Sicherheitsanbieter "Crypto" wurde entfernt. Jegliche Aufrufe von JCE-APIs (Java Cryptography Extension) mit einem aufgeführten Anbieter sollten nur durchgeführt werden, wenn der Anbieter im APK-Code enthalten ist oder mit dessen Abwesenheit fertig werden kann. Der Grund, warum Anwendungen diesen Anbieter verwenden, ist die Nutzung der SecureRandom-Implementierung. Wenn Ihre Anwendung auf setSeed() angewiesen war, um Schlüssel aus Strings abzuleiten, sollten Sie zur Verwendung von SecretKeySpec wechseln, um unverschlüsselte Schlüsselbytes direkt zu laden ODER verwenden Sie eine echte Schlüsselableitungsfunktion (KDF).

Daher funktioniert dies wie vorgesehen.

Wenn ich den Provider und den Algorithmus ändere, dann betrifft das Benutzer, die alle die App gerade benutzen.

Es scheint, dass Sie diesen Anbieter nur für Ihre Zufallsgenerierung verwenden. Wechseln Sie daher zu einem anderen Zufallszahlengenerator und folgen Sie den Anweisungen von Google. Dies sollte keine Auswirkungen auf bestehende Benutzer haben, wenn ich das richtig verstanden habe.

Und wenn ich falsch verstehe, wie Sie Crypto verwenden (da ich selten JCE direkt verwende), entwickeln Sie einen Migrationspfad, um vorhandene Benutzer Ihrer App auf einen anderen Algorithmus zu aktualisieren. Android N sollte erst in einigen Monaten in Produktionsform ausgeliefert werden, und selbst dann wird es eine langsame Aufnahme sein.

+0

KeyGenerator kGen = KeyGenerator.getInstance ("AES"); SecureRandom sr = SecureRandom.getInstance ("SHA1PRNG", "Crypto"); sr.setSeed (Samen); kGen.init (128, sr); // 192 und 256 Bits sind möglicherweise nicht verfügbar SecretKey sKey = kGen.generateKey(); So erstelle ich SecretKey. – Ananth

+0

Eine letzte Frage, Ich denke, ich ändere die Verschlüsselungs-/Entschlüsselungslogik und drücke ein App-Update auf alle vorhandenen Benutzer. Dann stürzt die App ab, wenn wir versuchen, bereits verschlüsselte Daten richtig zu entschlüsseln (Badpaddingexception)? Irgendeine Lösung, um dieses Problem zu verringern? – Ananth

+1

@Ananth: "Jede Lösung, um dieses Problem zu verringern?" - Wie ich geschrieben habe, haben Sie einen Migrationspfad. Veröffentlichen Sie bald ein App-Update, das mit Ihrem alten Ansatz entschlüsselt und mit einem neuen Ansatz, der auf Android N funktioniert, für Benutzer, die auf diese neue App-Version upgraden (im Gegensatz zur erstmaligen Installation, neu) Ansatz). Mit etwas Glück werden alle das Update nehmen, bevor Android N ausgeliefert wird. – CommonsWare

Verwandte Themen