flutter_secure_storage: Sporadic finalizer exceptions for underlying KeyStore on Android

Using Version 2.0.0 [✓] Flutter (Channel dev, v0.2.4, on Mac OS X 10.13.3 17D102, locale en-US) [✓] Android toolchain - develop for Android devices (Android SDK 27.0.3) [✓] iOS toolchain - develop for iOS devices (Xcode 9.2) [✓] Android Studio (version 3.0) [✓] IntelliJ IDEA Ultimate Edition (version 2017.3) [✓] Connected devices (3 available) Using Android Emulators of various versions (26+), and a physical Pixel (27)

Every now and then, but consistently once it happens once, flutter_secure_storage throws an exception when reading/writing a key.

Flutter throws the error: E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): Failed to handle method call E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): java.lang.IllegalArgumentException: Unsupported value: javax.crypto.IllegalBlockSizeException E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at io.flutter.plugin.common.StandardMessageCodec.writeValue(StandardMessageCodec.java:293) E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at io.flutter.plugin.common.StandardMethodCodec.encodeErrorEnvelope(StandardMethodCodec.java:70) E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler$1.error(MethodChannel.java:199) E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin.onMethodCall(FlutterSecureStoragePlugin.java:77) E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:191) E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at io.flutter.view.FlutterNativeView.handlePlatformMessage(FlutterNativeView.java:136) E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at android.os.MessageQueue.nativePollOnce(Native Method) E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at android.os.MessageQueue.next(MessageQueue.java:325) E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at android.os.Looper.loop(Looper.java:142) E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at android.app.ActivityThread.main(ActivityThread.java:6494) E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at java.lang.reflect.Method.invoke(Native Method) E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage( 8518): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

However, this is caused by a system exception:

E/System ( 8518): java.lang.IllegalStateException: Binder has been finalized! E/System ( 8518): at android.os.BinderProxy.transactNative(Native Method) E/System ( 8518): at android.os.BinderProxy.transact(Binder.java:764) E/System ( 8518): at android.security.IKeystoreService$Stub$Proxy.abort(IKeystoreService.java:1373) E/System ( 8518): at android.security.KeyStore.abort(KeyStore.java:531) E/System ( 8518): at android.security.keystore.AndroidKeyStoreCipherSpiBase.finalize(AndroidKeyStoreCipherSpiBase.java:744) E/System ( 8518): at android.security.keystore.AndroidKeyStoreRSACipherSpi$PKCS1Padding.finalize(Unknown Source:0) E/System ( 8518): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:250) E/System ( 8518): at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:237) E/System ( 8518): at java.lang.Daemons$Daemon.run(Daemons.java:103) E/System ( 8518): at java.lang.Thread.run(Thread.java:764)

The only ways I’ve resolved the issue is to do a hard restore of the device/emulator, as well as a full clean and rebuild of the project. It does not seem to happen on formal builds, just after a lot of debugging sessions, but nothing specific.

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Reactions: 3
  • Comments: 23 (5 by maintainers)

Most upvoted comments

Finding a potentially similar issue:

Debug Build: qemu-system-i386: Oreo

After a restart of the emulator, I receive this in the log output:

E/FlutterSecureStoragePl( 8971): Registration failed
E/FlutterSecureStoragePl( 8971): java.security.UnrecoverableKeyException: Failed to obtain information about private key
E/FlutterSecureStoragePl( 8971): 	at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:223)
E/FlutterSecureStoragePl( 8971): 	at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(AndroidKeyStoreProvider.java:259)
E/FlutterSecureStoragePl( 8971): 	at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePrivateKeyFromKeystore(AndroidKeyStoreProvider.java:269)
E/FlutterSecureStoragePl( 8971): 	at android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:94)
E/FlutterSecureStoragePl( 8971): 	at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:474)
E/FlutterSecureStoragePl( 8971): 	at java.security.KeyStore.getEntry(KeyStore.java:1560)
E/FlutterSecureStoragePl( 8971): 	at com.it_nomads.fluttersecurestorage.ciphers.RSACipher18Implementation.createRSAKeysIfNeeded(RSACipher18Implementation.java:93)
E/FlutterSecureStoragePl( 8971): 	at com.it_nomads.fluttersecurestorage.ciphers.RSACipher18Implementation.<init>(RSACipher18Implementation.java:30)
E/FlutterSecureStoragePl( 8971): 	at com.it_nomads.fluttersecurestorage.ciphers.StorageCipher18Implementation.<init>(StorageCipher18Implementation.java:31)
E/FlutterSecureStoragePl( 8971): 	at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin.<init>(FlutterSecureStoragePlugin.java:42)
E/FlutterSecureStoragePl( 8971): 	at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin.registerWith(FlutterSecureStoragePlugin.java:30)
E/FlutterSecureStoragePl( 8971): 	at io.flutter.plugins.GeneratedPluginRegistrant.registerWith(GeneratedPluginRegistrant.java:24)

And then the error returned from the plugin is:

"MissingPluginException(No implementation found for method read on channel plugins.it_nomads.com/flutter_secure_storage)"

Offending Call:

Future<dynamic> _getKeyFromStorage(String account) {
  final storage = new FlutterSecureStorage();
  return storage.read(key: '$account-key');
}

Problem resolves by uninstalling app and reinstalling, which is not optimal…

Happened to me too. Reproduced both on emulator (Nexus 5) and real device (Galaxy Note 8)

2020-04-17 10:50:36.071 19720-19720/? E/MethodChannel#plugins.it_nomads.com/flutter_secure_storage: Failed to handle method call java.lang.IllegalArgumentException: Unsupported value: javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT at io.flutter.plugin.common.StandardMessageCodec.writeValue(Unknown Source:392) at io.flutter.plugin.common.StandardMethodCodec.encodeErrorEnvelope(Unknown Source:21) at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler$1.error(Unknown Source:10) at e.c.a.a.onMethodCall(Unknown Source:133) at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(Unknown Source:17) at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(Unknown Source:57) at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(Unknown Source:4) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:326) at android.os.Looper.loop(Looper.java:181) at android.app.ActivityThread.main(ActivityThread.java:7073) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

Recently received same issue on an emulator like reported by @cchatfield Is it really don’t reproduce on real devices?

I received below exception in Nexus 5x

Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'void io.flutter.plugin.common.MethodChannel.setMethodCallHandler(io.flutter.plugin.common.MethodChannel$MethodCallHandler)' on a null object reference at com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin.onDetachedFromEngine(FlutterSecureStoragePlugin.java:62) at io.flutter.embedding.engine.FlutterEnginePluginRegistry.remove(FlutterEnginePluginRegistry.java:252) at io.flutter.embedding.engine.FlutterEnginePluginRegistry.remove(FlutterEnginePluginRegistry.java:260) at io.flutter.embedding.engine.FlutterEnginePluginRegistry.removeAll(FlutterEnginePluginRegistry.java:268) at io.flutter.embedding.engine.FlutterEnginePluginRegistry.destroy(FlutterEnginePluginRegistry.java:112) at io.flutter.embedding.engine.FlutterEngine.destroy(FlutterEngine.java:292) at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onDetach(FlutterActivityAndFragmentDelegate.java:500) at io.flutter.embedding.android.FlutterActivity.onDestroy(FlutterActivity.java:576) at android.app.Activity.performDestroy(Activity.java:6422) at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1142) at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3822) at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3853) at android.app.ActivityThread.-wrap5(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5421) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Happen to me too in Nexus 5X API 26 Emulator